“不知今夕是何年”的周基年解法 | 得物技术
2024年1月5日,周五,本来是个美好的日子,期待着马上到来的周末。可是下午1点多,接到产品一个问题反馈,经过一番排查,23年7月份上线的功能,对于跨年场景的处理有问题,其核心在于“周的年”获取方式不正确。
举个🌰
(1)前端:页面按照周来选择,例如 2024-12-30,返回给后端的是 Year:2025 -Week:1。2)后端:根据前端传递的 Year-Week 去DB中查询 数据开发回流的历史离线数据,神奇的事儿就发生了。如下图,数据中 Year字段,就不太正常,2024-12-30,应该是2025年的第一周。 同样的问题,也会出现在1月的开始几天,year字段不太正常。
这是出了什么问题呢?
因为不知今夕是何年啊!!!
ISO-8601标准
ISO-8601是国际标准化组织(ISO)发布的日期和时间表示法的标准,它定义了一种统一的日期和时间格式。ISO-8601标准的目的是提供一种易于理解、易于比较和易于存储的日期和时间表示方法,以便在不同的计算机系统和地区之间进行交互和共享。
周的定义
ISO-8601标准还定义了一种标准的周定义,用于表示周数。该定义基于一年中的周数,以及每周的起始日和结束日。根据ISO-8601标准的周定义:
-
一年中的第一个周:一年中的第一个周是包含该年的第一个星期四的周。这意味着该年的第一个周可能会跨越前一年和当前年。
-
每周的起始日:ISO-8601将周的起始日定义为星期一。
-
每周的结束日:ISO-8601将周的结束日定义为星期日。
根据这个定义,一年中的周数从1开始,持续到52或53。如果一年的第一个周跨越前一年和当前年,则第一个周的周数是前一年的最后一周,而不是当前年的第一周。
使用ISO-8601的周定义,可以准确地表示和计算一年中的周数。这种定义方式确保了在不同的计算机系统和地区之间,对于特定的日期,可以一致地确定所在的周数。
这一周算上一年还是下一年,取决于这一周的大多数日期(4天以上)在哪一年。算在前一年,就是前一年的最后一周;算在后一年就是后一年的第一周。周基年的定义
在ISO-8601标准中,对周的年定义是一种与常规年份定义略有不同的方式。它被称为周基年(Week-based Year)。根据ISO-8601标准的周基年定义:
-
一年中的第一个周:一年中的第一个周是包含该年的第一个星期四的周。这意味着该年的第一个周可能会跨越前一年和当前年。
-
每周的起始日:ISO-8601将周的起始日定义为星期一。
-
每周的结束日:ISO-8601将周的结束日定义为星期日。
根据这个定义,一年中的周数从1开始,持续到52或53。如果一年的第一个周跨越前一年和当前年,则第一个周的周数是前一年的最后一周,而不是当前年的第一周。
周基年的定义方式使得在计算和表示特定日期所在的周数时更加准确和统一。它确保了在不同的计算机系统和地区之间,对于特定日期所在的周数能够一致地确定。
简单说,当计算一个日期x是某年的某周,不能直接用常见的getYear,也就是不能用 自然年,要用 周基年。 在Java中,java.time.LocalDate类和java.time.temporal.WeekFields类提供了方便的方法来处理ISO-8601标准的周基年。通过使用这些类,可以轻松地获取指定日期所在的周基年和周数,并进行相关的日期和时间计算。 所以当需要用到某年某周的场景,必须用 周基年+周,否则迟早都是雷。最后贴一个jdk8的源代码实现,细细品读。从“周基年”这个小场景,可以发现编程基础的扎实与否多么重要,很多同学认为八股文没有价值,恰恰就是这种坚实的基础保证下,才能够让我们的业务系统运行顺畅无问题。
往期回顾
1. Monkey自动化工具结合B端组件可行性探索 | 得物技术
2. 库克与得物团队交流,称赞潮流网购创新
3. GitLab稳定性工程建设(多区多活架构) | 得物技术
4. QCon2023上海站参会内容分享|得物技术
文 / 摇浪
关注得物技术,每周一、三、五更新技术干货
要是觉得文章对你有帮助的话,欢迎评论转发点赞~
未经得物技术许可严禁转载,否则依法追究法律责任。
“
扫码添加小助手微信
如有任何疑问,或想要了解更多技术资讯,请添加小助手微信:

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
MySQL DBA 需要了解一下 InnoDB Online DDL 算法更新
在 MySQL 8.0.12 中,我们引入了一种新的 DDL 算法,该算法在更改表的定义时不会阻塞表。第一个即时操作是在表格末尾添加一列,这是来自腾讯游戏的贡献。 然后在 MySQL 8.0.29 中,我们添加了在表中任意位置添加(或删除)列的可能性。 在这篇文章中,我想重点讨论盲目使用此功能时可能发生的一些危险。 默认算法 从 MySQL 8.0.12 开始,对于任何支持的 DDL,默认算法是 INSTANT。这意味着 ALTER 语句只会修改数据字典中表的元数据。在操作的准备和执行阶段,不会对表进行独占元数据锁,表数据不受影响,使得操作是即时的。 另外两种算法是 COPY 和 INPLACE,Online DDL 操作参见手册。 然而,即使支持操作,Online DDL 也存在限制:一个表支持 64 次即时更改。到限制后,需要“重建”该表。 如果在 ALTER 语句(DDL 操作)期间未指定算法,则会默默地选择适当的算法。当然,如果没有预料到,这可能会导致生产中出现噩梦般的情况。 始终指定算法 因此,第一个建议始终是指定算法,即使它是执行 DDL 时的默认算法。当指定算法时,如果 ...
- 下一篇
Apache IoTDB 诞生记:学术圈出来的数据库,有啥不一样?
上周,《国产数据库圈,为啥那么多水货?》的讨论热度甚高,今天我们总结了一下直播嘉宾乔嘉林的看法,一起来看看工业界的情况有啥不同? 分享嘉宾: 乔嘉林 天谋科技联合创始人& CTO、Apache IoTDB PMC 及初创成员、清华大学博士、中国通信学会开源技术专委会委员、学术秘书。 从头参与建设物联网时序数据管理领域的首个 Apache 顶级项目 IoTDB,及第二个顶级项目 TsFile。 获 Apache Member(Apache 基金会委员)、中国开源先锋人物、清华大学水木学者、开放原子基金会银牌讲师,并作为 10 位基础软件的领军人物之一,荣获 2023 优秀软件工程师。相关成果获北京市科技进步奖一等奖。 Apache IoTDB 是一款低成本、高可用的物联网原生时序数据库,采用端边云协同的轻量化结构,支持一体化的物联网时序数据收集、存储、管理与分析。 01 创业启于开源 2016年我读博士期间,在学校参与了这个数据库的项目开发。这个项目在实验室酝酿了几年,2017年正式开源。一年之后,这个项目和里面的一些技术点、一些专利都捐给了 Apache 基金会,它成为了一个...
相关文章
文章评论
共有0条评论来说两句吧...