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 ...
随机推荐
- 实际工程Quartz与Spring设计与实现一体化的热部署
1.需求说明 主要负责项目任务调度.使用Quartz.以Spring为辅助. 如今有这样一个需求:我们不知道管理员想设定过多厂时间运行主任务,须要在配置文件定义.在配置好后须要马上运行.实现热部署. ...
- 检索06 - Oracle MySql SqlSever之间的区别和优缺点
三者之间区别 历史 1 Oracle:中文译作甲骨文,这是一家传奇的公司,有一个传奇的大老板Larry Ellision. Ellision 32岁还一事无成,读了三个大学,没得到一个学位文凭,换了十 ...
- 防爆搜索解决方案hdu1572下沙面(2)
#include<iostream> #include<map> #include<string> #include<cstring> #include ...
- Android中自定义View和自定义动画
Android FrameWork 层给我们提供了很多界面组件,但是在实际的商业开发中这些组件往往并不能完全满足我们的需求,这时候我们就需要自定义我们自己的视图和动画. 我们要重写系统的View就必须 ...
- Android中数据库和安装包分离
我们在做Android应用尤其是商业应用的时候,很多时候都需要后期版本升级,如果我们的数据库文件非常大,比如游戏之类的,这时候就不应该每次版本更新都去重新复制数据库.将数据库和安装包分离,下面来详细介 ...
- 区间树(segment tree)
区间树能够对保存的数据进行适当的预处理,以快速回复查询. 区间树常用于在一维数组的特定区间对查询进行快速回复.区间树的最典型也是最简单的应用就是求区间最小值的问题. 区间树的基本思路是,生成表示给定数 ...
- VBS学习日记(二) 基础知识
VBScript 基础知识 一.变量 1.全部单引號后面的内容都被解释为凝视.(在vbsedit中ctrl+m凝视,反凝视ctrl+shift+m) 2.在 VBScript 中,变量的命名规则遵循标 ...
- 2 Task中的延续和7种阻塞
1.wait using System; using System.Threading; using System.Threading.Tasks; namespace 多线程_List { clas ...
- windows 系统文件 —— 特殊文件及文件类型
0. .mht 文件(MHTML) MHTML文件又称为聚合 HTML 文档.Web 档案或单一文件网页(聚合成单一文件).单个文件网页可将网站的所有元素(包括文本和图形)都保存到单个文件中.这种封装 ...
- [自带避雷针]DropShadowEffect导致内存暴涨
原文:[自带避雷针]DropShadowEffect导致内存暴涨 [自带避雷针]DropShadowEffect导致内存暴涨 周银辉 从学习WPF开始, 就知道"位图效果"不是什 ...