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就会把日期分割的刚刚好。
关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接