慎用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