【问题标题】:How to fix ValueError time date does not match format when converting from string to datetime从字符串转换为日期时间时如何修复 ValueError 时间日期与格式不匹配
【发布时间】:2019-09-12 01:41:16
【问题描述】:

我试图将字符串转换为日期时间并不断收到错误:ValueError: time data 'Mon, 22 Apr 2019 17:04:38 +0200 (CEST)' does not match format '%a, %d %b %Y %H:%M:%S %z %Z'

from datetime import datetime
s = "Mon, 22 Apr 2019 17:04:38 +0200 (CEST)"
d = datetime.strptime(s, '%a, %d %b %Y %H:%M:%S %z %Z')

我错过了什么?

【问题讨论】:

  • 我刚刚注意到 (CEST) 和 %Z 不一样。通过使用 s = s[0:len(s)-7] 之类的东西删除 (CEST) 并删除 %Z,它可以工作。只是想确保我不会以任何方式搞砸日期?

标签: python python-3.x


【解决方案1】:

datetime 只能解析UTCtime.tzname 中列出的任何本地时区。它无法匹配(CEST),因为它不知道是哪个时区(这也是多余的,因为您使用偏移量+0200 定义了时区)。

您需要使用datetime.tzinfo 或通过导入外部库(如pytzpendulum)来实现自己的(CEST),以便将(CEST) 从字符串解析为datetime.timezone

另外,不要忘记在匹配字符串中包含括号()

【讨论】:

    【解决方案2】:

    这段代码通过了,但是,我不知道“CEST”在转换为字符串后会发生什么。

    from datetime import datetime
    tz = 'CEST'
    s = "Mon, 22 Apr 2019 17:04:38 +0200 " + tz
    d = datetime.strptime(s, '%a, %d %b %Y %H:%M:%S %z ' + tz)
    

    【讨论】:

    • 这不能解决发布的问题。
    • @Prune 我改了;这样更合适吗?
    • 稍微好一点。你绕过了这个问题,但没有给 OP 任何特别的解释或见解。
    • @Prune 是否应该删除 -1?这里的生活很艰难
    【解决方案3】:

    %Z 一般用于将转成字符串格式。无论如何,它是偏移量,而不是时区的名称。

    您的代码的其余部分是有效的,但是:

    s = "Mon, 22 Apr 2019 17:04:38 +0200"
    d = datetime.strptime(s, '%a, %d %b %Y %H:%M:%S %z')
    

    【讨论】:

    • 首先应该注意 %Z 作为 strptime 指令仅适用于 igonring GMT 或 UTC 文字。它不会导致知道日期时间对象。作为 strftime 指令,它为您提供了一个时区缩写,如 CEST - 这也不好(没有 IANA 名称)。除此之外,%z 在这里做得很好,但只给出了一个静态的 UTC 偏移量,所以不要与 timedelta 算术结合使用(参见例如here)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 2014-08-10
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多