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

相关文章
相关标签/搜索