BT

您是否属于早期采用者或者创新人士?InfoQ正在努力为您设计更多新功能。了解更多

慎用Java日期格式化

| 作者 曹知渊 发布于 2015年1月4日. 估计阅读时间: 不到一分钟 | 道AI风控、Serverless架构、EB级存储引擎,尽在ArchSummit!

2014年12月29日,Reddit上一条寥寥几语的留言引起了大量的回复,这条留言说道:

今天有可能变成2015年12月,快点修复它。

这条留言实际指向了Twitter上的一个帖子,这个帖子提醒大家,如果使用了YYYY的格式符来格式化日期,那么就有可能用错格式了。

Reddit的一位读者解释说,Twitter由于误用格式符,把当天的日期变成了2015年12月的某天。

那么日期为什么忽然变得不对了?原因是开发人员误用的格式符代表的是一种不同的日历系统。现行的公历通常被称为格里高利历(Gregorian calendar),它以400年为一个周期,在这个周期中,一共有97个闰日,在这种历法的设计中,闰日尽可能均匀地分布在各个年份中,所以一年的长度有两种可能:365天或366天。而本文提到的被错误使用的历法格式,是国际标准ISO 8601所指定的历法。这种历法采用周来纪日,样子看起来是这样的:2009-W53-7。对于格里高利历中的闰日,它也采用“闰周”来表示,所以一年的长度是364或371天。并且它规定,公历一年中第一个周四所在的那个星期,作为一年的第一个星期。这导致了一些很有意思的结果,公历每年元旦前后的几天,年份会和ISO 8601纪年法差一年。比如,2015年的第一个周四是1月1日,所以1月1日所在的那周,就变成了2015年的第一周。代表ISO 8601的格式符是YYYY,注意是大写的,而格里高利历的格式符是小写的yyyy,如果不小心把这两者搞混了,时间就瞬间推移了一年!维基百科上也有词条专门解释ISO 8601。

作为Java开发者,只要搞清楚YYYYyyyy区别,准确地使用两者,就不会出现这种错误。Reddit的评论中也有读者提到,在Joda Time中,使用YYYY是没有问题的。


感谢郭蕾对本文的审校。

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

java不需要区分 by wang guojun

如果是使用java的SimpleDateFormat,则不会存在这个问题,因为java压根就没有YYYY这种格式

不清晰 by james last

说的不明不白。Java里面到底有没有问题?如何用有问题?

Re: java不需要区分 by Alvin Cao

您好,我是本文的写作者,谢谢您的意见。可以参考docs.oracle.com/javase/8/docs/api/java/time/for...

Re: java不需要区分 by james last

你好,建议你给出一个例子,来告诉大家,哪种情况容易出问题,如何避免比较好。而不是让大家再去看一遍API。

Re: 不清晰 by Alvin Cao

您好,Java本身没有问题,使用的人需要注意Y和y区别,不要把y写成了Y,两者代表不同的日历系统。

试一下不就知道了 by wan jun

Calendar calendar = Calendar.getInstance();
calendar.set(2014, Calendar.DECEMBER, 29);
System.out.println(DateUtil.formatDate(calendar.getTime(), "yyyy-MM-dd"));
System.out.println(DateUtil.formatDate(calendar.getTime(), "YYYY-MM-dd"));

>
2014-12-29
2015-12-29

Re: java不需要区分 by 刘 刘

从1.7就有了,api有说明,y表示year,Y表示week year

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

7 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT