我已经观察了很多年,也得到了同样令人费解的行为,但我发现了一些逻辑。
看完之后the docs https://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior,我更好理解了一点:
%W - 一年中的周数(星期一为一周的第一天),采用十进制数。每天在新的一年里第一个星期一之前的时间被视为第 0 周。
So, %W
仅在第 0 周为新年的天数填写正确的值!这与以下结果完全一致:
2015:
>>> for i in range(7):
... datetime.strptime('%s %s %s' % (0, 2015, i), '%W %Y %w').date()
...
datetime.date(2015, 1, 4)
datetime.date(2014, 12, 29)
datetime.date(2015, 1, 1)
datetime.date(2014, 12, 31)
datetime.date(2015, 1, 1) # start of year
datetime.date(2015, 1, 2)
datetime.date(2015, 1, 3)
2016:
>>> for i in range(7):
... datetime.strptime('%s %s %s' % (0, 2016, i), '%W %Y %w').date()
...
datetime.date(2016, 1, 3)
datetime.date(2015, 12, 28)
datetime.date(2015, 12, 29)
datetime.date(2016, 1, 1)
datetime.date(2015, 12, 31)
datetime.date(2016, 1, 1) # start of year
datetime.date(2016, 1, 2)
2017:
>>> for i in range(7):
... datetime.strptime('%s %s %s' % (0, 2017, i), '%W %Y %w').date()
...
datetime.date(2017, 1, 1)
datetime.date(2016, 12, 26)
datetime.date(2016, 12, 27)
datetime.date(2016, 12, 28)
datetime.date(2016, 12, 29)
datetime.date(2017, 1, 1)
datetime.date(2016, 12, 31)
# ... start of year
2018:
>>> for i in range(7):
... datetime.strptime('%s %s %s' % (0, 2018, i), '%W %Y %w').date()
...
datetime.date(2018, 1, 7)
datetime.date(2018, 1, 1) # start of year
datetime.date(2018, 1, 2)
datetime.date(2018, 1, 3)
datetime.date(2018, 1, 4)
datetime.date(2018, 1, 5)
datetime.date(2018, 1, 6)
因此,在这一年真正开始之后,这种行为似乎是可预测的并且与文档一致。