【问题标题】:Python datetime strptime() does not match formatPython datetime strptime() 与格式不匹配
【发布时间】:2021-04-06 09:07:05
【问题描述】:

我收到以下错误,您可以在其中看到时间数据和我使用的格式

time data '20:07:35 EEDT Wed Mar 31 2021' does not match format '%H:%M:%S %Z %a %b %d %Y'

我使用了来自here 的指令,我看到格式与每个指令的描述相匹配。 你能看出这里有什么问题吗?

【问题讨论】:

  • 问题似乎出在时区
  • 它不接受“EEDT”。但是它适用于“UTC”
  • @peter %Z 接受 GMTUTC 它不会解析到知道日期时间。这可能会导致意想不到的结果,因为您可能期望 UTC,但您会得到本地时间,因为 Python 会这样对待幼稚的日期时间。

标签: python datetime strptime


【解决方案1】:
import datetime

time = '20:07:35 EEDT Wed Mar 31 2021'
time = time.replace('EEDT', '+0300')
datetime.datetime.strptime(time, '%H:%M:%S %z %a %b %d %Y')

【讨论】:

  • 喜欢这个想法,但 UTC 偏移量将是静态的,即由于 DST,timedelta 算术可能会产生意想不到的结果。当然,这只有在输入包含EEDT时才有效。
【解决方案2】:

您可以通过dateutil 的解析器将缩写时区映射到IANA time zone name

import dateutil

s = '20:07:35 EEDT Wed Mar 31 2021'

tzmapping = {"EEDT": dateutil.tz.gettz('Europe/Athens'),
             "EEST": dateutil.tz.gettz('Europe/Athens')} # add more if needed...

dtobj = dateutil.parser.parse(s, tzinfos=tzmapping)

这会给你

dtobj
# >>> datetime.datetime(2021, 3, 31, 20, 7, 35, tzinfo=tzfile('Europe/Athens'))
dtobj.utcoffset()
# >>> datetime.timedelta(seconds=10800) # UTC+3

请注意,timedelta 算法可以正常工作,即包括 DST 更改:

from datetime import timedelta
dtobj -= timedelta(7) # DST change: dtobj is now EEST, UTC+2
dtobj.utcoffset()
# >>> datetime.timedelta(seconds=7200)

【讨论】:

    【解决方案3】:

    EEDT 有问题。如果您忽略 EEDT(快速修复,不理想),那么您的代码可能如下所示:

    text = '20:07:35 EEDT Wed Mar 31 2021';
    fmt = '%H:%M:%S EEDT %a %b %d %Y';
    datetime.strptime(text, fmt)
    

    --编辑--

    用时区解析日期时间对于纯日期时间模块来说是困难的。我不是大专家,但pytzpython-datetutil 应该是不错的选择,根据此页面:https://medium.com/@nqbao/python-timezone-and-daylight-savings-e511a0093d0

    【讨论】:

    • 在解析指令中包含文字EEDT 的问题在于,这会使代码变得特定。它将在其他日期时间中断,例如如果 UTC 偏移量是 EEST。它会给你留下幼稚的日期时间(tzinfo==None),Python 默认将其视为本地时间 -> 可能会导致意外结果。
    • 你是对的。但我建议将我的解决方案作为临时/快速修复。更好的解决方案是使用已针对此类场景进行测试的专用库。
    • 是的,事情是在某些时候您必须从缩写映射到 IANA 时区,这是标准。但是缩写的时区是模棱两可的 - 参见例如timeanddate.com/time/zones 上的 BSTs - 其中有 3 个。这给标准库带来了困难,让用户头疼^^
    • 我是否正确理解,OP 还应该为他们的时区感知日期时间字符串提供近似位置以正确解析它们?即位置应该用于正确地将 IANA 时区转换为 UTC?
    • 是的,但这是一种相当复杂的方法。大多数情况下,一个简单的 UTC 偏移量就可以了,正如您从接受的答案中可以看出的那样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多