You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GNU date工具2025年1月13日周数计算异常问题

为何GNU date工具将2025年1月13日识别为第2周而非第3周?

这是因为GNU date的周数计算遵循年度周数规则,而cal -w显示的是当月内的周数,二者统计逻辑完全不同:

GNU date的周数规则

GNU date提供两种年度周数计算方式,对应不同的格式符:

  • %U:以周日为一周起始日,每年的第一个周日所在的周为第1周,该周日之前的日期归为第0周
  • %W:以周一为一周起始日,每年的第一个周一所在的周为第1周,该周一之前的日期归为第0周

结合2025年1月的日期来看:

  • 2025年第一个周日是1月5日,因此1月5日-11日为%U规则下的第1周,1月12日-18日为第2周
  • 2025年第一个周一是1月6日,因此1月6日-12日为%W规则下的第1周,1月13日-19日为第2周

1月13日同时落在两种规则的第2周区间内,因此date +%U和date +%W都返回02。

与cal -w的差异

cal -w显示的是当月内的周序号,从包含当月1号的那一周开始计数,所以1月13日所在的周是当月第3周,但这和GNU date统计的年度周数概念无关。


命令执行验证结果

❯ LANG=en cal -w
      January 2025
   Su Mo Tu We Th Fr Sa
 1           1  2  3  4
 2  5  6  7  8  9 10 11
 3 12 13 14 15 16 17 18
 4 19 20 21 22 23 24 25
 5 26 27 28 29 30 31


❯ LANG=en date +%W
02

❯ LANG=en date +%U
02

❯ lang=en date -d "last sunday +1 day" +%W
02

❯ lang=en date -d "last sunday +1 day" +%U
02

❯ LANG=en date -d "last sunday +1 day"
Mon Jan 13 00:00:00 MSK 2025

❯ locale
LANG=ru_RU.utf8
LC_CTYPE="ru_RU.utf8"
LC_NUMERIC="ru_RU.utf8"
LC_TIME="ru_RU.utf8"
LC_COLLATE="ru_RU.utf8"
LC_MONETARY="ru_RU.utf8"
LC_MESSAGES="ru_RU.utf8"
LC_PAPER="ru_RU.utf8"
LC_NAME="ru_RU.utf8"
LC_ADDRESS="ru_RU.utf8"
LC_TELEPHONE="ru_RU.utf8"
LC_MEASUREMENT="ru_RU.utf8"
LC_IDENTIFICATION="ru_RU.utf8"
LC_ALL=

❯ uname -a
Linux  6.12.8-arch1-1 #1 SMP PREEMPT_DYNAMIC Thu, 02 Jan 2025 22:52:26 +0000 x86_64 GNU/Linux

02

内容的提问来源于stack exchange,提问作者Artyom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 23:18:27