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)
怎么了?
答案 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/