【问题标题】:strptime seems to create wrong date from week numberstrptime 似乎从周数创建错误的日期
【发布时间】:2016-05-09 18:29:24
【问题描述】:

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)

怎么了?

【问题讨论】:

标签: python python-datetime


【解决方案1】:

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/

【讨论】:

  • 谢谢。在 python 3.6 发布之前,我将使用 isoweek。
【解决方案2】:

这里的事情是,当你给予时

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 年的第一个星期一。所以你得到的是 2016 年 4 月 1 日。

更新

当你尝试这个时

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

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

【讨论】:

    猜你喜欢
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    相关资源
    最近更新 更多