日期格式化使用 YYYY-MM-dd 的潜在问题
昨天在v站上看到这个关于YYYY-MM-dd的使用而出现Bug的帖子(v2ex.com/t/633650)非常有意思,所以拿过来分享一下。
在任何编程语言中,对于时间、数字等数据上,都存在很多类似这种平时一切OK,特定时间、特定环境出问题的情况。出现这种问题的根本原因还是我们对于各种数据结构的细节定义在开始的时候都不太注意,都是从每一次使用问题出现之后才开始有了“刻骨铭心”的认识。
不论昨天你是否也经历了这样的Bug,还是没有经历的读者,希望看到这篇文章之后,对这个细节可以上点心,避免日后因为这个细节而犯错。
下面就来一起看看这个问题的表现和原因吧:
问题表现
BUG 的原因
YYYY
是week-based-year
,表示:当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,那么这周就算入下一年。所以2019年12月31日那天在这种表述方式下就已经 2020 年了。
而当使用yyyy
的时候,就还是 2019 年。
相关说明
- https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#patterns
- https://nakedsecurity.sophos.com/2019/12/23/serious-security-the-decade-ending-y2k-bug-that-wasnt/
BLOG地址:www.liangsonghua.com
关注微信公众号:松花皮蛋的黑板报,获取更多精彩!
公众号介绍:分享在京东工作的技术感悟,还有JAVA技术和业内最佳实践,大部分都是务实的、能看懂的、可复现的