避坑: java中yyyy和YYYY的区别

项目场景:

这个是一个去年年底在预发环境测试时发现的问题,是在计算一个一年期保费的业务场景下发生的;


问题描述

yyyy和YYYY转换不一致的情况,只有在日期是当年的最后一个周时才会发生。
例如:2021年12月20日 通过 yyyy和YYYY格式化后,都是正常显示“2021-12-20”;

而2021年12月28日
通过 yyyy格式化后,显示“2021-12-28”;
通过 YYYY格式化后,显示“2022-12-28”;
在这里插入图片描述
在这里插入图片描述


// Date --> String
Calendar calendar= Calendar.getInstance();
// 测试:2021年12月20日 和 2021年12月28日 两种情况
calendar.set(2021,Calendar.DECEMBER,20);

SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sdf2 = new SimpleDateFormat("YYYY-MM-dd");

int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DAY_OF_MONTH);

System.out.println(year + "-" + month + "-" + day + " 通过yyyy转换:" + sdf1.format(calendar.getTime()));
System.out.println(year + "-" + month + "-" + day + " 通过YYYY转换:" + sdf2.format(calendar.getTime()));


原因分析:

通过上面的代码测试可以发现,2021年12月20日和2021年12月28日,分别是2021的倒数第二周和最后一周。
因为一年有52周,在计算超过52周时,会将年份+1;
所以2021年有52个周,28号属于第53周,就会出现年份+1,
而20号属于第52周,年份就不会变;


总结:

在之后的开发中,在使用SimpleDateFormat格式转化时,建议使用“yyyy-MM-dd”的方式。

当时代码里通过获取当前时间的方式,来作为保险起期,投保超期加1年作为保险止期,而这个代码也是经历过测试人员和业务人员测试的,比较万幸的是因为上游系统的上线延期,将上线日推迟到元旦之后,我们又在元旦前进行了一次全流程的配合验证才发现这个问题。
当然了我们程序中也有对于这种敏感日期数据的校验机制、报警和补偿流程,即使线上出现这个问题,也有兜底方案。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值