這一切的背后到底是機器故障,還是程序的bug?
難道Java API也不靠譜
朋友在我博客上發現一時間明顯錯誤,操作時間怎么會是2016年?在同一個for循環輸出到頁面的時間,唯獨這一個時間不對,整整多了一年。
請看圖,
結合2張圖,可以得知,
2015-12-27日這天的Unix時間戳經過SimpleDateFormat("YYYY-MM-dd")之后,結果會加了一年,變成了2016-12-27.注意這里的格式中“YYYY” 是大寫的。
而將"YYYY"換成"yyyy"即SimpleDateFormat("yyyy-MM-dd")之后結果都完全正確。
查詢文檔
得知,正確的用法就是用小寫的"y"。那么大寫的"Y"為啥有時對有時不對了呢?
什么鬼
進一步查詢java文檔得知,
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.
"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