慎用Java日期格式化

jopen 10年前發布 | 5K 次閱讀 Java

2014年12月29日,Reddit上一條寥寥幾語的留言引起了大量的回復,這條留言說道:

今天有可能變成2015年12月,快點修復它。

這條留言實際指向了推ter上的一個帖子,這個帖子提醒大家,如果使用了YYYY的格式符來格式化日期,那么就有可能用錯格式了。

Reddit的一位讀者解釋說,推ter由于誤用格式符,把當天的日期變成了2015年12月的某天。

那么日期為什么忽然變得不對了?原因是開發人員誤用的格式符代表的是一種不同的日歷系統。現行的公歷通常被稱為格里高利歷(Gregorian calendar),它以400年為一個周期,在這個周期中,一共有97個閏日,在這種歷法的設計中,閏日盡可能均勻地分布在各個年份中,所以一年的長度 有兩種可能:365天或366天。而本文提到的被錯誤使用的歷法格式,是國際標準ISO 8601所指定的歷法。這種歷法采用周來紀日,樣子看起來是這樣的:2009-W53-7。對于格里高利歷中的閏日,它也采用 “閏周”來表示,所以一年的長度是364或371天。并且它規定,公歷一年中第一個周四所在的那個星期,作為一年的第一個星期。這導致了一些很有意思的結 果,公歷每年元旦前后的幾天,年份會和ISO 8601紀年法差一年。比如,2015年的第一個周四是1月1日,所以1月1日所在的那周,就變成了2015年的第一周。代表ISO 8601的格式符是YYYY,注意是大寫的,而格里高利歷的格式符是小寫的yyyy,如果不小心把這兩者搞混了,時間就瞬間推移了一年!維基百科上也有詞條專門解釋ISO 8601。

作為Java開發者,只要搞清楚YYYY和yyyy區別,準確地使用兩者,就不會出現這種錯誤。Reddit的評論中也有讀者提到,在Joda Time中,使用YYYY是沒有問題的。

來自:http://www.infoq.com/cn/news/2015/01/java-date-format-with-caution

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!