竹笋

首页 » 问答 » 问答 » 新日期时间API三JSR3
TUhjnbcbe - 2025/2/11 17:35:00
北京治疗白癜风医院那里好 https://jbk.39.net/yiyuanzaixian/bjzkbdfyy/sfxbdf/

技术活,该赏点赞,收藏再看,养成习惯

大家好,我是小虚竹。之前有粉丝私聊我,问能不能把JAVA8新的日期时间API(JSR-0)知识点梳理出来。答案是肯定的,谁让我宠粉呢。由于内容偏多(超十万字了),会拆成多篇来写。

闲话就聊到这,请看下面的正文。

文章目录

DatTimFormattrDatTimFormattr类说明DatTimFormattr常用的用法格式化解析DatTimFormattr的坑、在正常配置按照标准格式的字符串日期,是能够正常转换的。如果月,日,时,分,秒在不足两位的情况需要补0,否则的话会转换失败,抛出异常。、YYYY和DD谨慎使用、DatTimFormattr.format(Instant)会报错报错信息:分析原因:解决方案:DatTimFormattrBuildrDatTimFormattrBuildr类说明解析风格配置推荐相关文章hutool日期时间系列文章其他

DatTimFormattr

DatTimFormattr类说明

DatTimFormattr的作用是进行格式化日期时间显示,且DatTimFormattr是不可变类且是线程安全的。

publicfinalclassDatTimFormattr{...}

说到时间的格式化显示,就要说老朋友SimplDatFormat了,之前格式化Dat就要用上。但是我们知道SimplDatFormat是线程不安全的,还不清楚的,请看这篇文章java的SimplDatFormat线程不安全出问题了,虚竹教你多种解决方案

DatTimFormattr常用的用法

格式化

    ZondDatTimzondDatTim=ZondDatTim.now();    DatTimFormattrformattr=DatTimFormattr.ofPattrn("yyyy-MM-ddTHH:mmZZZZ");    Systm.out.println(formattr.format(zondDatTim));    DatTimFormattrusFormattr=DatTimFormattr.ofPattrn("E,MMMM/dd/yyyyHH:mm",Local.US);    Systm.out.println(usFormattr.format(zondDatTim));    DatTimFormattrchinaFormattr=DatTimFormattr.ofPattrn("yyyyMMMddEEHH:mm",Local.CHINA);    Systm.out.println(chinaFormattr.format(zondDatTim));

解析

    DatTimFormattrformattr=DatTimFormattr.ofPattrn("yyyy年MM月dd日HH时mm分ss秒");    StringdatTim="0年08月日时分0秒";    LocalDatTimlocalDatTim=LocalDatTim.pars(datTim,formattr);    Systm.out.println(localDatTim);

大家有没有注意到,pars方法是放在LocalDatTim类中的,而不是DatTimFormattr类中。这样的设计符合正常的思路想法,想解析出LocalDatTim的日期时间,那就用LocalDatTim。想解析其他的JSR-0的日期时间对象,那就用对应的日期时间对象去解析。

博主把常用的日期时间API都看了,这些里面除了Clock(时钟不需要解析的),其他都有实现pars方法。

DatTimFormattr的坑

、在正常配置按照标准格式的字符串日期,是能够正常转换的。如果月,日,时,分,秒在不足两位的情况需要补0,否则的话会转换失败,抛出异常。

    DatTimFormattrDATE_TIME_FORMATTER=DatTimFormattr.ofPattrn("yyyy-MM-ddHH:mm:ss.SSS");    LocalDatTimdt=LocalDatTim.pars("0-7-0:6:.96",DATE_TIME_FORMATTER);    Systm.out.println(dt);

会报错:

java.tim.format.DatTimParsExcption:Txt0-7-0:6:.96couldnotbparsdatindx5

分析原因:是格式字符串与实际的时间不匹配

“yyyy-MM-ddHH:mm:ss.SSS”

“0-7-0:6:.96”

中间的月份格式是MM,实际时间是7

解决方案:保持格式字符串与实际的时间匹配

  DatTimFormattrDATE_TIME_FORMATTER=DatTimFormattr.ofPattrn("yyyy-MM-ddHH:mm:ss.SSS");    LocalDatTimdt=LocalDatTim.pars("0-07-0:6:.96",DATE_TIME_FORMATTER);    Systm.out.println(dt);

、YYYY和DD谨慎使用

    LocalDatdat=LocalDat.of(00,,);    DatTimFormattrformattr=DatTimFormattr.ofPattrn("YYYYMM");    //结果是0    Systm.out.println(formattr.format(dat));

Java’sDatTimFormattrpattrn“YYYY”givsyouthwk-basd-yar,(bydfault,ISO-standard)thyarofthThursdayofthatwk.

YYYY是取的当前周所在的年份,wk-basdyar是ISO规定的。00年月号,周算年份,就是0年

privatstaticvoidtryit(intY,intM,intD,Stringpat){DatTimFormattrfmt=DatTimFormattr.ofPattrn(pat);LocalDatdat=LocalDat.of(Y,M,D);Stringstr=fmt.format(dat);Systm.out.printf("Y=%0dM=%0dD=%0d"+"formattdwith"+"\"%s\"-%s\n",Y,M,D,pat,str);}publicstaticvoidmain(String[]args){tryit(00,0,0,"MM/DD/YYYY");tryit(00,0,,"DD/MM/YYYY");tryit(00,0,,"YYYY-MM-DD");tryit(00,0,7,"MM/DD/YYYY");tryit(00,0,8,"DD/MM/YYYY");tryit(00,0,9,"YYYY-MM-DD");}

Y=00M=0D=0formattdwith"MM/DD/YYYY"-0/0/00Y=00M=0D=formattdwith"DD/MM/YYYY"-/0/00Y=00M=0D=formattdwith"YYYY-MM-DD"-00-0-Y=00M=0D=7formattdwith"MM/DD/YYYY"-0/77/00Y=00M=0D=8formattdwith"DD/MM/YYYY"-78/0/00Y=00M=0D=9formattdwith"YYYY-MM-DD"-00-0-79

最后三个日期是有问题的,因为大写的DD代表的是处于这一年中那一天,不是处于这个月的那一天,但是dd就没有问题。

例子参考于:

1
查看完整版本: 新日期时间API三JSR3