strptime 似乎从周数创建了错误的日期

strptime seems to create wrong date from week number

strptime 似乎从周数创建了错误的日期...

第一种情况:

dt1 =  dateutil.parser.parse('2016-01-04 00:00:00+01:00')
dt1.isocalendar()
=> (2016, 1, 1) # (year, week number, week day)

from datetime import datetime
datetime.strptime('2016 1 1', '%Y %W %w')
=> datetime.datetime(2016, 1, 4, 0, 0)
# OK

第二种情况:

dt1 =  dateutil.parser.parse('2015-12-28 00:00:00+01:00')
dt1.isocalendar()
=> (2015, 53, 1) # (year, week number, week day)

datetime.strptime('2015 53 1', '%Y %W %w')
=> datetime.datetime(2016, 1, 4, 0, 0)
# Should return datetime.datetime(2015, 12, 28, 0, 0)

怎么了?

这里的事情是,当你给

from datetime import datetime
print(datetime.strptime('2015 52 1', '%Y %W %w'))

o/p : 2015-12-28 00:00:00

你会得到以上的日子。

%W The week number of the year (Monday as the first day of the week) as a decimal number [00,53]; leading zeros are permitted but not required.

这需要从星期一开始的第一天。

当你尝试这个时

from datetime import datetime
print(datetime.strptime('2015 1 1', '%Y %W %w'))

它会说 2015-01-05 00:00:00。所以,当我们来到 2015 年的第 53 周时。strptime 函数采用 2016 年的第一个星期一。所以你得到 4-01-2016。

更新:

当你尝试这个时

from datetime import datetime
print(datetime.strptime('2015 52 1', '%Y %W %w'))
o/p : 2015-12-28 00:00:00 

这是 2015 年的最后一周。

from datetime import datetime
print(datetime.strptime('2015 53 1', '%Y %W %w'))
print(datetime.strptime('2016 1 1', '%Y %W %w'))

这两个会给你相同的结果。

strptime %W 使用常规日历周。 ISO week date 与常规日历不同。年准确地分为 52 或 53 周(364 或 371 天)。

目前 python 的 strptime 不支持 iso 周日期,但计划用于 python 3.6。然后你可以使用 %G %V %w (我认为)来解析 iso 周日期。 http://bugs.python.org/issue12006

在那之前,您可以使用 isoweek 包来解析 iso 周日期。 https://pypi.python.org/pypi/isoweek/