日期YYYY与yyyy的区别

张天宇 on 2020-01-01

在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();
// 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 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));
// 小写 YYYY
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"避免衍生问题。