Uppercase ‘YYYY’ (week year) pattern is used: probably ‘yyyy’ (year) was intended
如果在项目中如下使用SimpleDateFormat的格式化字符串:
SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd");
则会出现如下提示:
Uppercase ‘YYYY’ (week year) pattern is used: probably ‘yyyy’ (year) was intended
导致该提示的主要原因是“YYYY-MM-dd”表达式的问题,注意通常我们使用时是用“yyyy-MM-dd”,也就是四个小写的y。那么使用大写的Y和小写的y格式化出来的结果有什么不同呢?
大多数情况下是没有问题的,只有当出现跨年的时候。比如如下代码:
Date dateCommence = new SimpleDateFormat("YYYY-MM-DD HH:mm:ss").parse("2021-01-06 00:00:00");
格式化之后的日期为(注意Y和D都大写了):
Sun Dec 27 00:00:00 SAST 2020
明明为2020-01-06,结果却是2020-12-27。
这是因为大写Y对应的是周的年份,而大写D对应的是一年中的一天。也就是说因为 DD代表的并不是一个月的某一天,而是一年的某一天,因此会超过31天,比如138天。
而YYYY使用的基于周的年份,而不是基于天数的,会计人员可以使用 YYYY来避免两年的日期分割,从而方便的计算工资等, 它的转换采用下面的规则:
- The first day of every week is Monday.(每周的第一天是星期一)
 - If a week is split at the end of the year then it is assigned to the year in which more that half of the days of that week occur.(如果一个星期在年底被分割,那么它被分配到一年中超过一半的一个星期发生)
 
所以你如果采用的是 YYYY来格式化的年份,那么你将不可避免的会在一年的结束或者一年的开始遇到这个问题,除非某年的第一天刚好是星期一,这样ISO-8601就会把日期分割的刚刚好。

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接