求你了,别用 YYYY-MM-dd!
昨天下午看同事提交的代码扫到这么一行心里顿时咯噔一下new SimpleDateFormat(“YYYY-MM-dd”)很多人敲代码顺手或者被代码补全带偏喜欢把 Y 和 M 全大写。但这在 Java 里等于给系统埋了一颗隐蔽性极强的“跨年雷”年底必炸。为了预现场景我构建了一段伪代码故意把时间设置到了 2026 年 12 月 31 日importjava.text.SimpleDateFormat;importjava.util.Calendar;importjava.util.Date;publicclassDateFormatTest{publicstaticvoidmain(String[]args){// 故意构造一个跨年边缘的时间2026年12月31日CalendarcalendarCalendar.getInstance();calendar.set(2026,Calendar.DECEMBER,31);Datedatecalendar.getTime();// 正确写法-小写 yyyySimpleDateFormatsdf1newSimpleDateFormat(yyyy-MM-dd);// 错误写法- 大写 YYYYSimpleDateFormatsdf2newSimpleDateFormat(YYYY-MM-dd);System.out.println(小写 yyyy: sdf1.format(date));System.out.println(大写 YYYY: sdf2.format(date));}}运行结果小写 yyyy:2026-12-31大写YYYY:2027-12-31// 注意看年份直接错乱了发现没原本是 2026 年的日期用大写的 YYYY 格式化后直接变成了 2027 年为什么会这样Java 的日期格式化标准里大小写不同意思完全不一样小写 yyyy代表真实的日历年份也就是你日历上看到的那一年。大写 YYYY代表的是 Week-Based-Year基于周的年份。简单来说只要这一周跨年了——比如这周既有 2026 年底的几天又包含了 2025 年的 1 月 1 日——那这周里的任何一天年份都会被算作下一年。这代码最恶心的地方就在这平时测试根本发现不了一切正常。只有到了每年最后那几天才会突然出问题试想一下用户的登录 Token 会因为「签发时间在未来」被集体拦截导致大面积掉线、扔进 MQ 的延迟消息也直接排到了下一年……细思恐极了朋友赶紧自查今天抽空打开 IDEA按下 Ctrl Shift FMac 是 Cmd Shift F全局搜一下 YYYY记得带上前引号。如果真搜到了赶紧改成 yyyy算是提前排了个大雷。顺手把这篇文章丢到团队群里让大家都自查一下能救一个是一个。关注我的公众号每天查看最新文章哦
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2424222.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!