问题:当前时间是2019-12-31,格式化时间时,用 SimpleDateFormat用的("YYYY/MM/dd"),页面上展示的是 2020/12/31
在v站(https://v2ex.com/t/633650?p=1)上看到,这个关于YYYY-MM-dd的错误使用导致的Bug帖子,当时看到"YYYY-MM-dd"标题是我就意识到了那个问题又出现了,不禁暗叹:年经贴的称号当之无愧啊。
这个问题发生在每年年末,果不其然今年的2019-12-31有人提Bug,今天明明是2019-12-31,为什么页面上显式的却是2020-12-31?
这个问题其他网友也有类似经历:
为什么会出现整个问题呢?
这要从官方文档说起:
y 计算方式:year-of-era
Y 计算方式:week-based-year
https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#patterns
大白话说就是:
YYYY是week-based-year,表示:当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,那么这周就算入下一年(2020年)。
所以2019年12月31日那天在这种表述方式下就已经 2020 年了。
而当使用yyyy的时候,就还是 2019 年。
既然用大写Y年末容易出现整个问题,那是不是意味着大写方式没有存在的必要呢?
当然不是,有小伙伴指出:"YYYY 的意义:YYYY 表示的是以周为基础的年度,会计人员依靠这一点来避免在两个不同的年份之间拆分周数,从而避免公司的工资单。"@zsdroid
好了,今天的分享就到这里。小伙伴们在工作中正确使用了吗,欢迎在下方留言吧。
测试案例:@JR1024
Calendar calendar = Calendar.getInstance();
// 2019-12-31
calendar.set(2019, Calendar.DECEMBER, 31);
Date strDate1 = calendar.getTime();
// 2020-01-01
calendar.set(2020, Calendar.JANUARY, 1);
Date strDate2 = calendar.getTime();
// 大写 YYYY
DateFormat formatUpperCase = new SimpleDateFormat("YYYY/MM/dd");
System.out.println("2019-12-31 to YYYY/MM/dd: " + formatUpperCase.format(strDate1));//异常
System.out.println("2020-01-01 to YYYY/MM/dd: " + formatUpperCase.format(strDate2));
// 小写 YYYY
DateFormat formatLowerCase = new SimpleDateFormat("yyyy/MM/dd");
System.out.println("2019-12-31 to yyyy/MM/dd: " + formatLowerCase.format(strDate1));
System.out.println("2020-01-01 to yyyy/MM/dd: " + formatLowerCase.format(strDate2));
本文整理自:https://v2ex.com/t/633650?p=1
转载请表明链接:https://blog.csdn.net/wabiaozia/article/details/103827593 || 链接