SimpleDateFormat以後爲什麼多了一年,難道Java API也這麼不靠譜?

這一切的背後究竟是機器故障,仍是程序的bug?html

難道Java API也不靠譜

朋友在我博客上發現一時間明顯錯誤,操做時間怎麼會是2016年?在同一個for循環輸出到頁面的時間,惟獨這一個時間不對,整整多了一年。java

請看圖,api

結合2張圖,能夠得知,oracle

2015-12-27日這天的Unix時間戳通過SimpleDateFormat("YYYY-MM-dd")以後,結果會加了一年,變成了2016-12-27.注意這裏的格式中「YYYY」 是大寫的。測試

而將"YYYY"換成"yyyy"即SimpleDateFormat("yyyy-MM-dd")以後結果都徹底正確。spa

查詢文檔.net

得知,正確的用法就是用小寫的"y"。那麼大寫的"Y"爲啥有時對有時不對了呢?code

什麼鬼

進一步查詢java文檔得知,orm

A week year is in sync with a WEEK_OF_YEAR cycle. All weeks between the first and last weeks (inclusive) have the same week year value. Therefore, the first and last days of a week year may have different calendar year values.htm

"YYYY"大寫的表明週年。根據原文,在我理解所謂週年的意思就是一年的開始那天的那周的第一天到下一年開始那天的那周的第一天的前一天。

因爲一週的第一天就是星期天,而2016年的元旦在本週五(2015-12-28)。那麼2016年的週年就是從2015-12-27(星期天) 到2016-12-31爲止。由於2017年元旦恰好在一週的第一天週日。

咱們能夠測試一下(前面已經測試了2015-12-27('YYYY')格式化後的年份是2016),

同理,2015年的週年就是 2014-12-28 到 2015-12-26.

咱們也能夠測試一下,

沒文化真可怕

所以經過SimpleDateFormat("YYYY-MM-dd")格式化以後多了一年也就很好解釋了,
就是經過獲取週年而後加上月份與日期,所以多了一年。

哎,說到底仍是掌握的太少,加上粗枝大葉才致使的這個Bug。人醜仍是要多讀書!

參考:

http://bbs.csdn.net/topics/390270515

http://docs.oracle.com/javase/7/docs/api/java/util/GregorianCalendar.html#week_year

相關文章
相關標籤/搜索