java 周历_Java中公历和ISO 8601周历的一个坑

原标题:Java中公历和ISO 8601周历的一个坑

作者:flhuoshan

链接:https://hacpai.com/article/1423812556502

如果尝试运行下面的代码,其结果可能会让你意外:

e2e39ff881c0204aa3344964fe5cbd36.png

运行结果为:

2014-12-29

2015-12-29

怎么样,看出区别了没? 在 Java 中对日期进行格式化的时候,对格式化时采用的符号大小写往往不是很在意,因而很容易跳进这样的“坑”中。其根本原因,就在于 YYYY 和 yyyy 在 Java 中表示年份的时候,是两套日期体系的东西。YYYY 是 ISO 8601 里的年份,而 yyyy 是格里高利历(即公历)里的年份。关于ISO 8601,WIKI 也有说明,详见:http://zh.wikipedia.org/wiki/ISO_8601。

ISO 8601 标准中采用周历来表示日期,在周历的一年中,有 364 天,或者 371 天。它规定,公历一年中第一个周四所在的那个星期,作为一年的第一个星期。这导致了一个很有意思的结果,在公历每年元旦前后的几天,年份会和 ISO 8601 纪年法差一年。这也解释了上面代码中的“意外”。例如2014-12-29 日,用ISO 8601 表示的周历就是2015-01- 星期一。

另外:周历在在 Java 中的格式为:YYYY-ww-EE。PS:关于日期格式化模式请见 D 的博文:https://88250.b3log.org/java-dateformat。

另外微博上@libre盖子 也发了一个相关的案例

原文链接地址:https://ericasadun.com/2018/12/25/iso-8601-yyyy-yyyy-and-why-your-year-may-be-wrong/

ef575c22d845a50670ca396c253c47dc.png

责任编辑:


版权声明:本文为weixin_39827315原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。