我知道我可以使用datetime.isocalendar()
来获取特定日期的周数。如果一周的数字和年份检索该周的第一天,我该怎么做反向呢。
答案 0 :(得分:6)
如果您仅限于stdlib,则可以执行以下操作:
>>> datetime.datetime.strptime('2011, 4, 0', '%Y, %U, %w')
datetime.datetime(2011, 1, 23, 0, 0)
答案 1 :(得分:0)
找不到标准库,所以不得不自己滚动。主要困难是找到ISO年份的第一天(可能是上一年)。你需要添加一些输入检查......
import datetime
def isoWeekToGregorian(isoYear, isoWeek, isoDayOfWeek):
#we have to find the date of the iso year
t0 = datetime.datetime(isoYear,1,1,0,0,0)
t0iso = t0.isocalendar()
if (t0iso[1] != 1):
t0prime = t0 + datetime.timedelta(7-t0iso[2])
else:
t0prime = t0 - datetime.timedelta(t0iso[2])
#we can add our weeks and days...
return t0prime + datetime.timedelta(7*(isoWeek-1) + isoDayOfWeek)
我们可以创建一个简单的测试:
#TEST: we know 2004 has 53 weeks...
t0 = datetime.datetime(2004,12,26,0,0,0)
t1 = datetime.datetime(2005,1,10,0,0,0)
ndays = (t1-t0).days + 1
for i in range(ndays):
d0 = t0 + datetime.timedelta(i)
d0iso = d0.isocalendar()
if (d0 != isoWeekToGregorian(d0iso[0],d0iso[1],d0iso[2])):
print "failed: %s" % d0
else:
print d0, d0iso
哪个正确打印:
2004-12-26 00:00:00 (2004, 52, 7)
2004-12-27 00:00:00 (2004, 53, 1)
2004-12-28 00:00:00 (2004, 53, 2)
2004-12-29 00:00:00 (2004, 53, 3)
2004-12-30 00:00:00 (2004, 53, 4)
2004-12-31 00:00:00 (2004, 53, 5)
2005-01-01 00:00:00 (2004, 53, 6)
2005-01-02 00:00:00 (2004, 53, 7)
2005-01-03 00:00:00 (2005, 1, 1)
2005-01-04 00:00:00 (2005, 1, 2)
2005-01-05 00:00:00 (2005, 1, 3)
2005-01-06 00:00:00 (2005, 1, 4)
2005-01-07 00:00:00 (2005, 1, 5)
2005-01-08 00:00:00 (2005, 1, 6)
2005-01-09 00:00:00 (2005, 1, 7)
2005-01-10 00:00:00 (2005, 2, 1)