java使用SimpleDateFormat格式化日期年格式YYYY引发跨年问题

本文揭示了在使用SimpleDateFormat进行日期格式化时,yyyy和YYYY的区别。YYYY代表weekyear,导致跨年日期解析错误,如将2019-12-29解析为2020年。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近排查到一个由错误日期格式问题引发的跨年问题,今天有空了记录下来。

在开发中经常使用SimpleDateFormat来进行日期数据的格式化,这里年份项常见的有两种yyyy和YYYY,代码里也能看见混用的情况,通常情况下这两个值返回的结果是一个样的,比如

SimpleDateFormat simple=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat week=new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
Date time=simple.parse("2014-11-28 00:00:00");
assert simple.format(time).equals(week.format(time));

然而,在涉及跨年的时间段时,却不是这样了,例如

SimpleDateFormat simple=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat week=new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");

Date time=simple.parse("2019-12-29 00:00:00");
System.err.println(simple.format(time));
System.err.println(week.format(time));

上面的输出为

2019-12-29 00:00:00
2020-12-29 00:00:00

两者输出整整差了一年,并不符合我们的预期。因此在通常情况下,格式化日期不应该使用YYYY格式。

之所以会出现错误是因为,在日期格式里,小写的y才是我们通常想要的年份,大写的Y指的是week year,也即是说,当前周所包含的年份的较大值。2019-12-29这天是星期天,在老外看来是一周的开始(即2019/12/29到2020/01/04算完整的一周),这个周里既包含2019年也包容2020年,因此在YYYY格式下,这周里的任意一天输出都是2020。

再回过头来看上面那个输出,当要格式化的日期time值为2019-12-29 00:00:00时,在YYYY-MM-dd HH:mm:ss格式下,MM-dd HH:mm:ss 对应的输出为12-29 00:00:00,这个是没问题的,而YYYY输出的不是2019,而是换成了2020,因此两个拼接到一起,就成了2020-12-29 00:00:00,引发了bug。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值