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

Bash脚本计算年份周数异常:2019年应得53周却返回52周求助

问题:Bash计算2019年周数(周日为起始)返回52而非53的原因及解决方法

问题描述

需要在Bash脚本中计算一年的周数,规则为一周从周日开始。按此规则2019年应包含53个日历周:第1周始于2018年12月30日(周日),第53周始于2019年12月29日(周日)。但执行以下脚本返回结果为52,而%U的定义是“以周日为一周起始的年份周数(00..53)”,需找出问题原因及解决方法:

#!/bin/bash

week=$(date --date='2019-12-31' +%U)
echo $week

问题原因

date命令的%U参数规则和自定义统计规则存在核心差异:

  • %U的官方定义是:以周日为一周起始,每年的第一个周日为第1周的起点,该日期之前的所有天数(包括上一年的周日)统一归为第0周。
  • 2019年的第一个周日是1月6日,因此从1月6日到12月29日的周日依次对应第1到第52周;2018年12月30日的周日在date规则中属于2018年的第52周,不会被计入2019年的周数编号。
  • 脚本取的是2019年12月31日的周数,该日期属于2019年的第52周(对应周日为12月29日),因此返回52,这和“将上一年最后一个周日算作当年第1周”的规则不匹配。

解决方法

以下两种方式可实现所需的周数统计规则:

方法一:基于周数编号调整

通过判断当年首周是否跨年度,对最后一个周日的周数编号进行调整:

#!/bin/bash
year=2019

# 获取当年最后一个周日的日期
last_sunday=$(date --date="$year-12-31 -$(date --date="$year-12-31" +%u) days" +%Y-%m-%d)
# 获取该周日对应的%U周数
last_week=$(date --date="$last_sunday" +%U)

# 判断当年1月1日是否为周日(%u返回1=周一,7=周日)
first_day_weekday=$(date --date="$year-01-01" +%u)
if [ $first_day_weekday -ne 7 ]; then
    # 首周跨年度,周数加1
    total_weeks=$((last_week + 1))
else
    total_weeks=$last_week
fi

echo "$year年按规则的周数:$total_weeks"

方法二:基于日期差计算

直接计算当年首周周日到年末的天数差,再转换为周数:

#!/bin/bash
year=2019

# 获取当年首周的周日(若1月1日是周日则为当天,否则取上一年的最后一个周日)
first_sunday=$(date --date="$year-01-01 -$(( (date --date="$year-01-01" +%u) % 7 )) days" +%Y-%m-%d)
# 计算首周周日到年末的秒数差,转换为天数后除以7加1得到总周数
days_diff=$(( (date --date="$year-12-31" +%s) - (date --date="$first_sunday" +%s) ))
total_weeks=$(( days_diff / (7*24*3600) + 1 ))

echo "$year年按规则的周数:$total_weeks"

执行以上任意脚本,都会返回符合规则的53周。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 16:13:21