我们经常会在日历中看到本周是今年的第几周,这是如何定义的?又如何用 Python 来计算呢?

日历星期的定义

国标《GB/T 7408-2005》和 ISO 标准《ISO 8601-2004》对日历周的定义一致:

  • 以星期一为一周的开始,编号为 01,星期日为 07;
  • 一年中的第一个日历星期是包含该年 1 月 4 日的那一周;
  • 一年有 52 或 53 个日历星期。

Python 模块

标准库 datetimecalendar 可用于处理日历星期。

datetime

import datetime
timezone_cst = datetime.timezone(offset=datetime.timedelta(hours=8))
new_year = datetime.date(2000, 1, 1)
now = datetime.datetime.now(tz=timezone_cst)
  • isoweekday() 获取星期编号(1-7,周一为 1);
  • isocalendar() 返回 (ISO 年,ISO 周数,ISO 星期编号)。

calendar

calendar.weekday() 返回星期编号(0-6,周一为 0)。

import calendar
calendar.weekday(2000, 1, 1)    # 5

示例

计算给定时间所在星期的起止时间

import datetime

def get_week_by_time(given_time):
    weekday_num = given_time.isoweekday()
    week_start = datetime.datetime.combine(
        given_time - datetime.timedelta(days=weekday_num-1),
        datetime.time(),
        tzinfo=given_time.tzinfo
    )
    week_end = week_start + datetime.timedelta(weeks=1)
    return week_start, week_end

timezone_cst = datetime.timezone(offset=datetime.timedelta(hours=8))
now = datetime.datetime.now(tz=timezone_cst)
week_start, week_end = get_week_by_time(now)
print(now)
print(week_start)
print(week_end)

给定年份和周数,计算该周的起止时间

import datetime

def get_week_by_weeknum(year, weeknum, tzinfo=None):
    day_jan_4th = datetime.date(year, 1, 4)
    first_week_start = day_jan_4th - datetime.timedelta(days=day_jan_4th.isoweekday()-1)
    week_start = datetime.datetime.combine(
        first_week_start + datetime.timedelta(weeks=weeknum-1),
        datetime.time(),
        tzinfo=tzinfo,
    )
    week_end = week_start + datetime.timedelta(weeks=1)
    return week_start, week_end

timezone_cst = datetime.timezone(offset=datetime.timedelta(hours=8))
week_start, week_end = get_week_by_weeknum(2020, 46, tzinfo=timezone_cst)
print(week_start)
print(week_end)

参考链接