工作周计算器
计算日期范围内的工作周数和ISO周数。
Loading...
工作周计算器帮助您统计两个日期之间的工作周数,适用于项目规划、薪资周期、合同期限和学期安排等场景。与简单地将天数除以 7 不同,此工具能正确处理不完整的周,并遵循将星期一定义为每周第一天的 ISO 8601 标准。
ISO 周编号是一种国际标准的周标记方式,在欧洲以及制造业、物流业和建筑业中广泛使用。ISO 日历中,第 1 周定义为包含该年第一个星期四的那一周。本工具可同时计算所选日期范围内的总工作周数和每周对应的 ISO 周编号。
使用方法非常简单:选择开始日期和结束日期,即可立即显示总工作周数、按月分类及 ISO 周编号。所有计算均在浏览器本地完成,无需向服务器发送任何数据。
常见问题
代码实现
from datetime import date, timedelta
def get_iso_week(d: date) -> tuple[int, int]:
"""Return (iso_year, iso_week) for a date"""
iso = d.isocalendar()
return iso.year, iso.week
def get_monday_of_week(d: date) -> date:
"""Get the Monday of the week containing date d"""
days_since_monday = d.weekday() # Monday=0, Sunday=6
return d - timedelta(days=days_since_monday)
def count_work_weeks(start: date, end: date) -> list[dict]:
"""List all ISO work weeks in a date range"""
weeks = []
current = get_monday_of_week(start)
while current <= end:
iso_year, iso_week = get_iso_week(current)
friday = current + timedelta(days=4)
weeks.append({
'iso_year': iso_year,
'iso_week': iso_week,
'week_label': f'W{iso_week:02d}',
'start': current,
'end': friday,
'month': current.strftime('%B %Y'),
})
current += timedelta(weeks=1)
return weeks
# Usage
start = date(2026, 1, 1)
end = date(2026, 3, 31)
weeks = count_work_weeks(start, end)
print(f"Total work weeks: {len(weeks)}")
for w in weeks[:5]: # Show first 5
print(f" {w['week_label']} ({w['iso_year']}): {w['start']} - {w['end']}")
Comments & Feedback
Comments are powered by Giscus. Sign in with GitHub to leave a comment.