Java 时间格式化:有去无回之谜

发表于:2016-11-18 10:35

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:James Pan's Blog    来源:51Testing软件测试网采编

  很长一段时间里,我一直以为,对于同一个时间格式,我们把一个时间对象序列化成字符串之后,还能反序列化成和原对象表达同一个时间的时间对象,至少在不考虑时区之类的问题时,这个命题应该成立。
  然而就在这两天,我遇到了一个打破上述认知的奇怪问题,Date 对象格式化之后再解析回来,就完全乱套了。
import java.text.SimpleDateFormat;
import java.util.Date;
public class WeekOfDay {
public static void main(String[] args) throws Exception {
SimpleDateFormat format = new SimpleDateFormat("YYYY-MM-dd");
Date date = new Date(2016-1900, 11-1, 11);
String formatted = format.format(date);
System.out.println(formatted); // 2016-11-11
Date fromTimestamp = format.parse(formatted);
System.out.println(fromTimestamp); // Sun Dec 27 00:00:00 CST 2015
}
}
  这段代码可以重现这个问题。一番搜索之后发现, YYYY 是 Week Year,而 yyyy 是 Year,这里如果使用 yyyy 就可以避免 parse 之后时间混乱的问题。
  但是为什么 parse 之后时间会变的这么离谱呢?调试代码一直跟踪到 java.util.GregorianCalendar#setWeekDate ,才发现了其中奥秘。
  由于格式中不包含 WEEK_OF_YEAR 、 DAY_OF_WEEK 等对应的标识,代码第 143 行将日历对象设置为 2016 年第一周第一天所在的日期和时间,这一天正好是 2015 年 12 月 27 日。
  parse 的问题弄明白了,那么为什么 format 能正常工作呢?其实只是因为没有踩到边界条件而已。 YYYY 是 Week Year,就是这一周第一天所处的年份,这几天还没到元旦,所以 format 的时候误打误撞拿到了正确的结果。
  最后,全称量词果然还是要改成存在量词的~
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号