zoukankan      html  css  js  c++  java
  • SimpleDateFormat之后为何多了一年,难道Java API也这么不靠谱?

    这一切的背后到底是机器故障,还是程序的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

    本文作者心尖偏左。因知识本身在变化,作者也在不断学习成长,文章内容也不定时更新,为避免误导读者,方便追根溯源,请诸位转载注明出处。有问题欢迎与我讨论,共同进步。
  • 相关阅读:
    浅谈Sass与Less区别、优缺点
    混合开发的几个框架
    什么是Node.js?
    初入AngularJS
    jQuery的效果函数
    jQuery的一些选择器
    CSS3新增的属性有哪些:
    linux 新建用户、用户组 以及为新用户分配权限
    linux各个文件作用
    Linux CentOS6.5 命令修改网络配置
  • 原文地址:https://www.cnblogs.com/xjpz/p/5083101.html
Copyright © 2011-2022 走看看