如果在项目中如下使用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就会把日期分割的刚刚好。



Uppercase ‘YYYY’ (week year) pattern is used: probably ‘yyyy’ (year) was intended插图

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:http://choupangxia.com/2020/12/23/date-format/