每年年末都会出现的Bug,你今天因为 YYYY-MM-dd 被提 BUG 了吗

问题:当前时间是2019-12-31,格式化时间时,用 SimpleDateFormat用的("YYYY/MM/dd"),页面上展示的是 2020/12/31

 

在v站(https://v2ex.com/t/633650?p=1)上看到,这个关于YYYY-MM-dd的错误使用导致的Bug帖子,当时看到"YYYY-MM-dd"标题是我就意识到了那个问题又出现了,不禁暗叹:年经贴的称号当之无愧啊。

 

这个问题发生在每年年末,果不其然今年的2019-12-31有人提Bug,今天明明是2019-12-31,为什么页面上显式的却是2020-12-31?

 

这个问题其他网友也有类似经历:

 

 

为什么会出现整个问题呢?

这要从官方文档说起​:

 

y 计算方式:year-of-era

Y 计算方式:week-based-year

 

https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#patterns

 

​大白话说就是:

YYYY是week-based-year,表示:当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,那么这周就算入下一年(2020年)。

所以2019年12月31日那天在这种表述方式下就已经 2020 年了。

而当使用yyyy的时候,就还是 2019 年。

既然用大写Y年末容易出现整个问题,那是不是意味着大写方式没有​存在的必要呢?

当然不是,有小伙伴指出:"YYYY 的意义:YYYY 表示的是以周为基础的年度,会计人员依靠这一点来避免在两个不同的年份之间拆分周数,从而避免公司的工资单。"@zsdroid ​

 

好了,今天的分享就到这里。​小伙伴们在工作中正确使用了吗,欢迎在下方留言吧。

测试案例:@JR1024 

Calendar calendar = Calendar.getInstance();
		// 2019-12-31
		calendar.set(2019, Calendar.DECEMBER, 31);
		Date strDate1 = calendar.getTime();
		// 2020-01-01
		calendar.set(2020, Calendar.JANUARY, 1);
		Date strDate2 = calendar.getTime();
		
		// 大写 YYYY
		DateFormat formatUpperCase = new SimpleDateFormat("YYYY/MM/dd");
		System.out.println("2019-12-31 to YYYY/MM/dd: " + formatUpperCase.format(strDate1));//异常
		System.out.println("2020-01-01 to YYYY/MM/dd: " + formatUpperCase.format(strDate2));
		// 小写 YYYY
		DateFormat formatLowerCase = new SimpleDateFormat("yyyy/MM/dd");
		System.out.println("2019-12-31 to yyyy/MM/dd: " + formatLowerCase.format(strDate1));
		System.out.println("2020-01-01 to yyyy/MM/dd: " + formatLowerCase.format(strDate2));

本文整理自:https://v2ex.com/t/633650?p=1

转载请表明链接:https://blog.csdn.net/wabiaozia/article/details/103827593  ||  链接​​​​​​​

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菠萝科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值