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
相关产品推荐
相关产品推荐

