每年一问: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 的规则,避免引起不必要的麻烦。

本文由 白鲸开源科技 提供发布支持!

相关推荐
菠萝派爱跨境40 分钟前
利用轮换IP的强大功能
大数据·服务器·网络·网络协议·tcp/ip·ip
司晓杰40 分钟前
使用 Flink CDC 构建 Streaming ETL
大数据·数据仓库·flink·etl
申尧强43 分钟前
flink异步流(async stream)解析
大数据·flink
core5121 小时前
flink cdc oceanbase(binlog模式)
大数据·flink·binlog·oceanbase·安装·cdc
申尧强1 小时前
flink state源码解析
大数据·flink
GIS数据转换器3 小时前
城市安全风险综合监测预警平台
大数据·人工智能·安全·3d·智慧城市
罗仲虎3 小时前
CDP集群安全指南-动态数据加密
大数据·运维·安全·cloudera
小盼江4 小时前
Hadoop服装数据分析系统 大屏数据展示 智能服装推荐系统(协同过滤余弦函数)
大数据·hadoop·分布式
申尧强5 小时前
flink的EventTime和Watermark
大数据·flink
JermeryBesian5 小时前
Flink系统知识讲解之:如何识别反压的源头
大数据·flink