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

时间:2016-02-01 10:31:28

标签: python python-datetime

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)

怎么了?

2 个答案:

答案 0 :(得分:3)

这里的事情是,当你给出

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'))

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

答案 1 :(得分:2)

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/