java中日期格式化的大坑
前言
我们都知道在java中进行日期格式化使用simpledateformat。通过格式yyyy-MM-dd等来进行格式化,但是你知道其中微小的坑吗?
yyyy和YYYY
示例代码
@Test publicvoidtestWeekBasedYear(){ Calendarcalendar=Calendar.getInstance(); //2019-12-31 calendar.set(2019,Calendar.DECEMBER,31); DatestrDate1=calendar.getTime(); //2020-01-01 calendar.set(2020,Calendar.JANUARY,1); DatestrDate2=calendar.getTime(); //大写YYYY SimpleDateFormatformatYYYY=newSimpleDateFormat("YYYY/MM/dd"); System.out.println("2019-12-31转YYYY/MM/dd格式:"+formatYYYY.format(strDate1)); System.out.println("2020-01-01转YYYY/MM/dd格式:"+formatYYYY.format(strDate2)); //小写YYYY SimpleDateFormatformatyyyy=newSimpleDateFormat("yyyy/MM/dd"); System.out.println("2019-12-31转yyyy/MM/dd格式:"+formatyyyy.format(strDate1)); System.out.println("2020-01-01转yyyy/MM/dd格式:"+formatyyyy.format(strDate2)); }
输出的结果
2019-12-31转YYYY/MM/dd格式:2020/12/31
2020-01-01转YYYY/MM/dd格式:2020/01/01
2019-12-31转yyyy/MM/dd格式:2019/12/31
2020-01-01转yyyy/MM/dd格式:2020/01/01
卧槽?2019变成2020了?
YYYY是怎么做到的呢
Java'sDateTimeFormatterpattern"YYYY"givesyoutheweek-based-year,(bydefault,ISO-8601standard)theyearoftheThursdayofthatweek.
下面就是用YYYY格式化代码
12/29/2019将会格式化到2019年这一周还属于2019年
12/30/2019将会格式化到2020年这一周已经属于2020年
看字说话YYYY,week-basedyear是ISO8601规定的。
2019-12-31号这一天,按周算年份已经属于2020年了,格式化之后就变成2020年,后面的月份日期不变。
dd和DD
示例代码
privatestaticvoidtryit(intY,intM,intD,Stringpat){ DateTimeFormatterfmt=DateTimeFormatter.ofPattern(pat); LocalDatedat=LocalDate.of(Y,M,D); Stringstr=fmt.format(dat); System.out.printf("Y=%04dM=%02dD=%02d"+ "formattedwith"+ "\"%s\"->%s\n",Y,M,D,pat,str); } publicstaticvoidmain(String[]args){ tryit(2020,01,20,"MM/DD/YYYY"); tryit(2020,01,21,"DD/MM/YYYY"); tryit(2020,01,22,"YYYY-MM-DD"); tryit(2020,03,17,"MM/DD/YYYY"); tryit(2020,03,18,"DD/MM/YYYY"); tryit(2020,03,19,"YYYY-MM-DD"); }
输出结果
Y=2020M=01D=20formattedwith"MM/DD/YYYY"->01/20/2020
Y=2020M=01D=21formattedwith"DD/MM/YYYY"->21/01/2020
Y=2020M=01D=22formattedwith"YYYY-MM-DD"->2020-01-22
Y=2020M=03D=17formattedwith"MM/DD/YYYY"->03/77/2020
Y=2020M=03D=18formattedwith"DD/MM/YYYY"->78/03/2020
Y=2020M=03D=19formattedwith"YYYY-MM-DD"->2020-03-79
这里的大写的DD代表的是处于这一年中那一天,不是处于这个月的那一天,但是dd就没有问题。
结论
格式化日期一定要选用yyyy-MM-dd哦!
到此这篇关于java中日期格式化的大坑的文章就介绍到这了,更多相关java日期格式化内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!