大家当心啊,YYYY-MM-dd有坑啊,现在才知道

事情来源于一个线上的问题,来看看截图:



看到了吧,时间既然线上2020年12月29日了

翻看代码,好坑啊,时间格式使用的是YYYY-MM-dd;

自己又测试了一下:

<code>public static void main(String[] args) { SimpleDateFormat yMd = new SimpleDateFormat("yyyy-MM-dd"); Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.YEAR, 2019); calendar.set(Calendar.MONTH, 11); calendar.set(Calendar.DAY_OF_MONTH, 29); System.out.println("yyyy-MM-dd = " + yMd.format(calendar.getTime())); SimpleDateFormat YMd = new SimpleDateFormat("YYYY-MM-dd"); Calendar calendar2 = Calendar.getInstance(); calendar2.set(Calendar.YEAR, 2019); calendar2.set(Calendar.MONTH, 11); calendar2.set(Calendar.DAY_OF_MONTH, 29); System.out.println("YYYY-MM-dd = " + YMd.format(calendar2.getTime())); }————————————————版权声明:本文为CSDN博主「Rick1993」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/thqtzq/article/details/103826620/<code>

输出结果大吃一惊:

<code>yyyy-MM-dd = 2019-12-29YYYY-MM-dd = 2020-12-29/<code>

翻阅了一下资料,

YYYY 是 week-based-year,当天所在的周属于的年份,一周从周日开始,到周六结束;只要本周跨年了,那么这周就算入下一年。所以打印2020-12-29。

留下资料,希望大家自行排查自己的项目代码:

参考连接:

https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#patterns
https://nakedsecurity.sophos.com/2019/12/23/serious-security-the-decade-ending-y2k-bug-that-wasnt/