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

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

   public static void main(String[] args) throws ParseException {
        DateFormat format = new  SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date parse = format.parse("2020-12-21 22:22:22");

        
        System.out.println(DateUtils.dateToString(parse,"yyyy-MM-dd HH:mm:ss"));
        System.out.println(DateUtils.dateToString(parse,"YYYY-MM-dd HH:mm:ss"));
    }

输出

2020-12-21 22:22:22
2020-12-21 22:22:22

然而,在涉及跨年的时间段时,却不是这样了,例如 注意这里的时间为27号

   public static void main(String[] args) throws ParseException {
        DateFormat format = new  SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date parse = format.parse("2020-12-27 22:22:22");

        
        System.out.println(DateUtils.dateToString(parse,"yyyy-MM-dd HH:mm:ss"));
        System.out.println(DateUtils.dateToString(parse,"YYYY-MM-dd HH:mm:ss"));
    }

输出

2020-12-27 22:22:22
2021-12-27 22:22:22

之所以会出现错误是因为,在日期格式里,
小写的y才是我们通常想要的年份,大写的Y指的是week year
也即是说,当前周所包含的年份的较大值。

2019-12-29这天是星期天,在老外看来是一周的开始(即2020/12/27到2021/01/03算完整的一周),这个周里既包含2020年也包容2021年,因此在YYYY格式下,这周里的任意一天输出都是2021。

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值