写点什么

每年一问:Java 日期格式化中周所在年引发的 bug

作者:白鲸开源
  • 2025-01-03
    天津
  • 本文字数:737 字

    阅读完需:约 2 分钟

每年一问:Java日期格式化中周所在年引发的bug

作者 | 袁丙泽

编辑 | Debra Chen


在处理涉及每年周数问题时,如果处于不同的地区或文化中,总会遇见一些标准问题。比如基督教信徒喜欢把周日当做每周的第一天。而不同的编程语言,也会有自己的处理方案,有些是每年从第 0 周开始,有些是从第一周开始。对于数据分析者来说,标准不统一带来的歧义是非常致命的。


在 Apache DolphinScheduler 使用过程中,每年新旧年交替的时候,日期的使用问题就会凸显出来。为避免日期带来的歧义,笔者认为最好的办法是严格按照 ISO 8601 标准进行处理。


从 Java 8 开始,Java 的日期格式化开始支持 ISO 8601 标准。大写 Y 表示周所在年。小写 y 表示自然年。由于很多程序在开发时并未注意大小写问题。在处理日期时,每年年末或者年初都能碰到由于这个问题踩到坑的。


参考:https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/format/DateTimeFormatter.html

根据 ISO 8601 的规则,再来详细了解下周及周年的详细的计算规则:

1. 每年有 52 周或者 53 周

2. 周一至周日为一个完整周。

3. 每周的周一是该周的第 1 天。周日是该周的第 7 天

4. 每年的第一周 为 每年的第一个 周四 所在的周。比如 2017 年 1 月 5 日为当年的第一个周四,那么 2017-01-02 至 2017-01-08 为 2017 年第一周

5. 每年的最后一周为当年最后一个周四所在的周。比如 2016 年 12 月 29 日为当年的最后一个周四,那么 2016-12-26 至 2017-01-01 为 2016 年的最后一周。

6. 周年,当前周所在的年份为周年。比如 2017 年 1 月 1 日的周年为 2016 年。2016 年 1 月 1 日,2016 年 1 月 2 日,2016 年 1 月 3 日的周年均为 2015 年。 2024 年 12 月 30 日、12 月 31 日的周年均为 2025 年。


参考:https://blog.csdn.net/yuanbingze/article/details/72127763


再次提醒大家,在日期使用时注意 Y 的大小写和 ISO 8601 的规则,避免引起不必要的麻烦。

用户头像

白鲸开源

关注

一家开源原生的DataOps商业公司。 2022-03-18 加入

致力于打造下一代开源原生的DataOps 平台,助力企业在大数据和云时代,智能化地完成多数据源、多云及信创环境的数据集成、调度开发和治理,以提高企业解决数据问题的效率,提升企业分析洞察能力和决策能力。

评论

发布
暂无评论
每年一问:Java日期格式化中周所在年引发的bug_开源_白鲸开源_InfoQ写作社区