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
SimpleDateFormat之后为何多了一年,难道Java API也这么不靠谱?的更多相关文章
- SimpleDateFormat使用详解——日期、字符串应用
public class SimpleDateFormat extends DateFormat SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的具体类. 它允许格式化 (d ...
- java日期处理SimpleDateFormat等
1.mysql数据库中有这样一个表: mysql> select * from test_table;+----------+---------------------+| username | ...
- SimpleDateFormat使用详解及与毫秒的相互转换
1. SimpleDateFormat使用详解 public class SimpleDateFormat extends DateFormat SimpleDateFormat 是一个以国别敏感的方 ...
- SimpleDateFormat使用详解
http://blog.csdn.net/gubaohua/article/details/575488 public class SimpleDateFormat extends DateForma ...
- SimpleDateFormat线程不安全问题处理
在工作中,通过SimpleDateFormat将字符串类型转为日期类型时,发现有时返回的日期类型出错,调用方法如下: public final class DateUtil { static fina ...
- SimpleDateFormat使用简析
title: SimpleDateFormat使用简析 date: 2016-07-11 11:48:20 tags: Java SimpleDateFormat --- [转载自博客:http:// ...
- SimpleDateFormat使用具体解释
public class SimpleDateFormat extends DateFormat SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的详细类. 它同意格式化 ...
- SimpleDateFormat使用特定的解释
public class SimpleDateFormat extends DateFormat SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的详细类. 它同意格式化 ...
- Java 中Calendar、Date、SimpleDateFormat学习总结
在之前的项目中,经常会遇到Calendar,Date的一些操作时间的类,并且总会遇到时间日期之间的格式转化问题,虽然做完了但是总是忘记,记不清楚,每次还都要查找资料.今天总结一下,加深印象. Cale ...
随机推荐
- vijos1070 新年趣事之游戏 - 次小生成树
传送门 题目大意: 求原图的最小生成树,和次小生成树. 题目分析: kruskals求mst(\(O(mlogm)\)) 考虑次小生成树暴力的做法,因为次小生成树总是由最小生成树删掉一条边并添加一条边 ...
- C++ 类包含关系Demo 笔记
is-a关系 类包含关系 构造 拷贝构造函数 重载福值运营商 析构函数 动态内存分配和释放 new delete操作 static 数据成员 好友功能 重载输入>>输出<<操 ...
- Java入门程序
JavaC.exe 编译器,编译.java文件 Java.exe 解释器,执行class文件 编译命令 javac HelloWorld.java 编译后 会产生同名的.class文件 javac编 ...
- 推荐一些C#相关的网站和书籍
1.http://msdn.microsoft.com/zh-CN/ 微软的官方网站,C#程序员必去的地方.那里有API开发文档,还有各种代码.资源下载. 2.http://social.msdn.m ...
- 5 wcf双工
1 创建两个项目 Wcf_WsDual_Service Wcf_WsDual_Client 2 Wcf_WsDual_Service 项目中创建 LoginService.cs 的wcf文件 ...
- Cache coherence protocol
A cache coherence protocol facilitates a distributed cache coherency conflict resolution in a multi- ...
- Matlab Tricks(二十二)—— 自定义函数
printme = @(txt) print('-dpdf', sprintf('figures/Example_%s',txt)); % 这里的 print 显然不是控制台输出一句话,而是图像的命名 ...
- Android备注26.Android异步任务(AsyncTask)
转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 一.引言 我们知道Android的UI线程主要负责处理用户的按键事件.用户触屏事件及屏幕画 ...
- 说谎的简单工厂模式设计模式&工厂方法模式&Abstract Factory模式
工厂模式被分成三个:简单工厂模式,抽象工厂模式和工厂模式. 定义: 简单工厂模式:用一个单独的类来做创造实例的过程. 工厂模式:一个用于创建对象的接口.让子类决定实例化哪一个类,讲一个类的实例化 延迟 ...
- debian 下py2.7 安装mysql模块
先安装pip 然后用pip安装 setuptools 安装模块的时候会报错 python setup.py install sh: mysql_config: command not found Tr ...