代码中 YYYY-MM-DD 和 yyyy-MM-dd 的区别 Bug

最近新旧年交替之际,又有关于 YYYY-MM-DD 和 yyyy-MM-dd 的区别 Bug 讨论出现,本文简单去了解了一下二者的区别不同。

 

1、yyyy 和 YYYY不一样

如果对时间处理不那么熟悉的朋友看到这里,会认为 yyyy 和 YYYY 有什么区别么?在代码里面敲一下,他们的结果也都是相同的啊!

publicclassDateTest{publicstaticvoidmain(String[]args){Calendarcalendar=Calendar.getInstance();calendar.set(2019,Calendar.AUGUST,31);DatestrDate=calendar.getTime();DateFormatformatUpperCase=newSimpleDateFormat("yyyy-MM-dd");System.out.println("2019-08-31toyyyy-MM-dd:"+formatUpperCase.format(strDate));formatUpperCase=newSimpleDateFormat("YYYY-MM-dd");System.out.println("2019-08-31toYYYY/MM/dd:"+formatUpperCase.format(strDate));}}

运行结果为:

2019-08-31 to yyyy-MM-dd:2019-08-31 2019-08-31 to YYYY/MM/dd:2019-08-31

但是如果我们把日期改成 2019-12-31 再试试呢?结果产生了差异:

2019-12-31 to yyyy-MM-dd:2019-12-31 2019-12-31 to YYYY-MM-dd:2020-12-31

YYYY这么大的能耐,能跑到2020年代去?

我 2019年底买的东西,你如果用YYYY来格式化出库日期,我是不是得到 2020年底才能收到货?此bug问题挺大的呀!

Java's DateTimeFormatter pattern "YYYY" gives you the week-based-year, (by default, ISO-8601 standard) the year of the Thursday of that week.

例子:

下面就是用YYYY格式化代码

  • 12/29/2019 将会格式化到 2019年这一周还属于2019年
  • 12/30/2019 将会格式化到 2020年这一周已经属于2020年

week-based year 是 ISO 8601 规定的。

2019-12-31号这一天,如果按照周算年份已经属于 2020年了,所以格式化之后就变成 2020年,后面的月份日期不变。

  • y:year-of-era;正正经经的年;
  • Y:week-based-year;只要本周跨年,那么这周就算入下一年;也就是 12 月

这是开发过程中的一个小细节,一不小心就掉到坑里了。

 

2、dd 和 DD 也不一样

别看字,看代码

YYYY-MM-DD 和 yyyy-MM-dd 的区别 Bug

输出结果:

Y=2020 M=01 D=20 formatted with "MM/DD/YYYY" -> 01/20/2020Y=2020 M=01 D=21 formatted with "DD/MM/YYYY" -> 21/01/2020Y=2020 M=01 D=22 formatted with "YYYY-MM-DD" -> 2020-01-22Y=2020 M=03 D=17 formatted with "MM/DD/YYYY" -> 03/77/2020Y=2020 M=03 D=18 formatted with "DD/MM/YYYY" -> 78/03/2020Y=2020 M=03 D=19 formatted with "YYYY-MM-DD" -> 2020-03-79

看到没有?

最后的3个日期都错误了,这里的大写的DD代表的是处于这一年中那一天,不是处于这个月的那一天。

小伙伴们一定要记住了不要犯类似的错误。

 

3、结论

YYYY 和 yyyy 不一样的,DD 和 dd 也是不一样的,开发代码过程中要切记!

 

转载请注明链接地址:荐爱小站 » 代码中 YYYY-MM-DD 和 yyyy-MM-dd 的区别 Bug

赞 (15) 赏 !

觉得文章有用就打赏一下吧,赠人玫瑰手有余香!

支付宝扫一扫打赏

微信扫一扫打赏