在V站看到讨论跨年导致日期格式YYYY和yyyy导致日期显示Bug的帖子,没想到腾讯也中招了。
帖子中指出,腾讯的微信公众平台在2019年元旦所在的星期显示全部按照2020显示了,如2019-12-31显示为了2020-12-31。并据该现象推测,应该是日期格式使用出错。
先看一段程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| Calendar calendar = Calendar.getInstance();
calendar.set(2019, Calendar.DECEMBER, 31); Date strDate1 = calendar.getTime();
calendar.set(2020, Calendar.JANUARY, 1); Date strDate2 = calendar.getTime();
DateFormat dateFormat0 = new SimpleDateFormat("YYYY/MM/dd"); System.out.println("2019-12-31 to YYYY/MM/dd: " + dateFormat0.format(strDate1)); System.out.println("2020-01-01 to YYYY/MM/dd: " + dateFormat0.format(strDate2));
DateFormat dateFormat1 = new SimpleDateFormat("yyyy/MM/dd"); System.out.println("2019-12-31 to yyyy/MM/dd: " + dateFormat1.format(strDate1)); System.out.println("2020-01-01 to yyyy/MM/dd: " + dateFormat1.format(strDate2));
|
程序输出:
1 2 3 4
| 2019-12-31 to YYYY/MM/dd: 2020/12/31 2020-01-01 to YYYY/MM/dd: 2020/01/01 2019-12-31 to yyyy/MM/dd: 2019/12/31 2020-01-01 to yyyy/MM/dd: 2020/01/01
|
确实如此,经过查证原因如下:
YYYY表示的是以周为基础的年度,会计人员依靠这一点来避免在两个不同的年份之间拆分周数,从而避免公司的工资单出错。意思是当天所在周属于的年份,一周从周日开始算计算,周六结束,只要本周跨年,那么这一周就算下一年的。也就是说:年份如果用Y会是这周的年份,y才是标准的年份。
结合今年的情况来看,2019-12-31,按照YYYY,已经是2020的第一周了。
立即推,以后使用尽量使用"yyyy-MM-dd"避免衍生问题。