昨天下午看同事提交的代码,扫到这么一行,心里顿时咯噔一下:new SimpleDateFormat("YYYY-MM-dd")
很多人敲代码顺手,或者被代码补全带偏,喜欢把 Y 和 M 全大写。但这在 Java 里,等于给系统埋了一颗隐蔽性极强的“跨年雷”,年底必炸。
为了预现场景,我构建了一段伪代码,故意把时间设置到了 2026 年 12 月 31 日:
运行结果:
发现没?原本是 2026 年的日期,用大写的 YYYY 格式化后,直接变成了 2027 年!
为什么会这样?
Java 的日期格式化标准里,大小写不同,意思完全不一样:
小写
yyyy:代表真实的日历年份,也就是你日历上看到的那一年。大写
YYYY:代表的是 Week-Based-Year(基于周的年份)。简单来说,只要这一周跨年了——比如这周既有 2026 年底的几天,又包含了 2027 年的 1 月 1 日——那这周里的任何一天,年份都会被算作下一年。
这代码最恶心的地方就在这:平时测试根本发现不了,一切正常。只有到了每年最后那几天才会突然出问题,试想一下:用户的登录 Token 会因为「签发时间在未来」被集体拦截导致大面积掉线、扔进 MQ 的延迟消息也直接排到了下一年……细思恐极了朋友!
赶紧自查!
今天抽空打开 IDEA,按下 Ctrl + Shift + F(Mac 是 Cmd + Shift + F),全局搜一下 "YYYY(记得带上前引号)。如果真搜到了,赶紧改成 yyyy,算是提前排了个大雷。
本文链接:https://www.kinber.cn/post/6353.html 转载需授权!
推荐本站淘宝优惠价购买喜欢的宝贝:

支付宝微信扫一扫,打赏作者吧~
