技术活,该赏点赞,收藏再看,养成习惯
大家好,我是小虚竹。之前有粉丝私聊我,问能不能把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就没有问题。
例子参考于: