先介绍下历史背景
在给一组数据生成一个唯一批次号的时候使用固定前缀字符串+日期格式化的结构来拼接,却发生了2024年12月30日的批次号转换成了xxxxx20251230的现象
问题概述
在对日期进行格式化或解析的过程中,我们发现了一些与跨年相关的不准确情况。特别是当我们使用 YYYYMMdd 格式来表示日期时,由于没有充分考虑月份和日之间的关系,某些情况下可能导致日期被误解,尤其是在接近一年结束或开始的时候。
以java为例,当我们使用日期转换的使用使用到DateFormat对象,构建DateFormat对象需要传入一个日期的格式pattern
影响范围
该问题影响了所有依赖于 YYYYMMdd 格式的日期解析和生成的地方,特别是在涉及到日期计算、排序、比较等操作时。这可能会影响到数据的准确性,以及基于这些数据做出的决策。
原因分析
某些开发人员可能没有充分理解 YYYY 和 yyyy(小写的 ‘y’ 表示一年中的周数)之间的区别,这在不同的编程语言和库中有不同的含义。
开发者可能没有意识到需要特别处理跨年的情况,或者使用的日期处理库没有正确处理这种情况。
这边日期明明是2024年,格式转换后却变成了2025年12月30日
这是因为
y:year-of-era;正正经经的年,即元旦过后;Y:week-based-year;只要本周跨年,那么这周就算入下一年;就比如说今年(2019-2020) 12.31 这一周是跨年的一周,而 12.31 是周二,那使用 YYYY 的话会显示 2020,使用 yyyy 则会从 1.1 才开始算是 2020。