我们经常会在日历中看到本周是今年的第几周,这是如何定义的?又如何用 Python 来计算呢?
日历星期的定义
国标《GB/T 7408-2005》和 ISO 标准《ISO 8601-2004》对日历周的定义一致:
- 以星期一为一周的开始,编号为 01,星期日为 07;
- 一年中的第一个日历星期是包含该年 1 月 4 日的那一周;
- 一年有 52 或 53 个日历星期。
Python 模块
标准库 datetime
和 calendar
可用于处理日历星期。
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)