事情来源于一个线上的问题,来看看截图:
看到了吧,时间既然线上2020年12月29日了
翻看代码,好坑啊,时间格式使用的是YYYY-MM-dd;
自己又测试了一下:
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
输出结果大吃一惊:
yyyy-MM-dd = 2019-12-29
YYYY-MM-dd = 2020-12-29
翻阅了一下资料,
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/