我有一个ISO 8601年和周的编号,我需要将此值转换为该周(星期一)的第一天的日期。我怎样才能做到这一点?
datetime.strptime()同时使用%W和%U指令,但都不遵守datetime.isocalendar()使用的ISO 8601工作日规则。
%W
%U
更新: Python的3.6支持的%G,%V并%u指令也存在于libc中,使这一个班轮:
%G
%V
%u
>>> datetime.strptime('2011 22 1', '%G %V %u') datetime.datetime(2011, 5, 30, 0, 0)
更新2 :Python 3.8添加了该fromisocalendar()方法,该方法更加直观:
fromisocalendar()
>>> datetime.fromisocalendar(2011, 22, 1) datetime.datetime(2011, 5, 30, 0, 0)
%W将第一个星期一定为第1周,但ISO定义第1周为1月4日。所以从
datetime.strptime('2011221', '%Y%W%w')
如果第一个星期一和1月4日分别在不同的星期内,请假。如果1月4日是星期五,星期六或星期日,则后者是这种情况。因此,以下应该工作:
from datetime import datetime, timedelta, date def tofirstdayinisoweek(year, week): ret = datetime.strptime('%04d-%02d-1' % (year, week), '%Y-%W-%w') if date(year, 1, 4).isoweekday() > 4: ret -= timedelta(days=7) return ret