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

SimpleDateFormat之后为何多了一年,难道Java API也这么不靠谱?的更多相关文章

  1. SimpleDateFormat使用详解——日期、字符串应用

    public class SimpleDateFormat extends DateFormat SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的具体类. 它允许格式化 (d ...

  2. java日期处理SimpleDateFormat等

    1.mysql数据库中有这样一个表: mysql> select * from test_table;+----------+---------------------+| username | ...

  3. SimpleDateFormat使用详解及与毫秒的相互转换

    1. SimpleDateFormat使用详解 public class SimpleDateFormat extends DateFormat SimpleDateFormat 是一个以国别敏感的方 ...

  4. SimpleDateFormat使用详解

    http://blog.csdn.net/gubaohua/article/details/575488 public class SimpleDateFormat extends DateForma ...

  5. SimpleDateFormat线程不安全问题处理

    在工作中,通过SimpleDateFormat将字符串类型转为日期类型时,发现有时返回的日期类型出错,调用方法如下: public final class DateUtil { static fina ...

  6. SimpleDateFormat使用简析

    title: SimpleDateFormat使用简析 date: 2016-07-11 11:48:20 tags: Java SimpleDateFormat --- [转载自博客:http:// ...

  7. SimpleDateFormat使用具体解释

      public class SimpleDateFormat extends DateFormat SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的详细类. 它同意格式化 ...

  8. SimpleDateFormat使用特定的解释

      public class SimpleDateFormat extends DateFormat SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的详细类. 它同意格式化 ...

  9. Java 中Calendar、Date、SimpleDateFormat学习总结

    在之前的项目中,经常会遇到Calendar,Date的一些操作时间的类,并且总会遇到时间日期之间的格式转化问题,虽然做完了但是总是忘记,记不清楚,每次还都要查找资料.今天总结一下,加深印象. Cale ...

随机推荐

  1. 百度UEditor上传图片-再再总结一次

    本周,CSDN有个网友遇到了百度UEditor上传问题,最后商定付50元钱,我帮他解决这个问题.    他最初想自己搞定这个问题,结果搞了好多次,好几天,还是没能解决.    2015年1月17日8: ...

  2. Visual Studio for Mac

    Visual Studio for Mac 初体验   你喜爱的 IDE,现在可用于 Mac 来自:https://www.visualstudio.com/zh-hans/vs/visual-stu ...

  3. 使用Visual Studio 2010 一步一步创建Powershell Module 和 Cmdlet

    现在就用C#写一个超级简单的Module和Cmdlet 1. 在VS中创建一个Library的项目 文件->新建->项目->C#->Class Library 在这里给我们的C ...

  4. leveldb原理和使用

    LevelDB是一个基于本地文件的存储引擎,非分布式存储引擎,原理基于BigTable(LSM文件树),无索引机制,存储条目为Key-value.适用于保存数据缓存.日志存储.高速缓存等应用,主要是避 ...

  5. 两个QWidget叠加,可部分代替layout的功能

    在QT开发过程中,有时候会遇到这样的问题,当我们自己创建了一个Layout对象以后,使用QWidget的setLayout方法,将这个Layout对象应用到窗口中的时候,发现窗口上没有我们添加的控件, ...

  6. WPF中取得预定义颜色

    原文:WPF中取得预定义颜色 使用XAML代码取得.net预定义颜色:<Page    xmlns="http://schemas.microsoft.com/winfx/2006/x ...

  7. android延时处理任务范例

    今天要做一个任务,要求图片做button开关,点击出发对应事件.点击打开,图片左边显示几行字体,这几行字体是延时显示的.以下将主要代码附上.以下是main.xml <?xml version=& ...

  8. ORACLE 11G在相同的linuxserver从实施例1满库到实例2上

    早期的导出命令: [root@powerlong4 ~]# su - oracle [oracle@powerlong4 ~]$ export ORACLE_SID=pt1; [oracle@powe ...

  9. FFmpeg来源简单分析:结构会员管理系统-AVClass

    ===================================================== FFmpeg章列表: [架构图] FFmpeg源码结构图 - 解码 FFmpeg源码结构图 ...

  10. 浅谈 Swift 中的 Optionals

    input[type="date"].form-control,.input-group-sm>input[type="date"].input-grou ...