【问题标题】:python datetime formatting confusionpython日期时间格式混乱
【发布时间】:2018-07-17 19:19:13
【问题描述】:

如果我错了,请纠正我,但假设我们有日期:

Wed, 27 Jun 2018 11:20:33 -0500

如果我们使用 python 中的日期时间来转换它 (datetime.datetime.strptime('Wed, 27 Jun 2018 11:20:33 -0500', '%a, %d %b %Y %H:%M:%S %z')),这会生成一个比 UTC 大 1 小时的时间,即 12:20:33。但是,实际上这不应该是 UTC-5(减去 5 小时)。我正在采用这种存储在 XML 文件中的日期格式。其中许多在时间戳末尾有 -0500 或 +0000。我在这里遗漏了什么吗?

import datetime
dt = datetime.datetime.strptime('Wed, 27 Jun 2018 11:20:33 -0500',
                                 '%a, %d %b %Y %H:%M:%S %z')
print(dt.timestamp())

print(datetime.datetime.fromtimestamp(int(dt.timestamp())).strftime('%Y-%m-%d %H:%M:%S'))

【问题讨论】:

    标签: python python-3.x datetime timezone


    【解决方案1】:

    这里正确生成了时区

    >>> import datetime
    >>> datetime.datetime.strptime('Wed, 27 Jun 2018 11:20:33 -0500', '%a, %d %b %Y %H:%M:%S %z')
    datetime.datetime(2018, 6, 27, 11, 20, 33, tzinfo=datetime.timezone(datetime.timedelta(-1, 68400)))
    

    datetime.timedelta(-1, 68400) 表示 -5 小时,这是正确的。

    您应该在问题中添加导致“不正确”结果的所有步骤,以及您的期望。

    编辑:现在您编辑了您的问题 - 您的问题来自 .timestamp().fromtimestamp() 的使用 - 这些方法是时区幼稚的,因此它们不会保留时区信息。

    如果需要,您必须自己存储:

    t = datetime.datetime.strptime('Wed, 27 Jun 2018 11:20:33 -0500', '%a, %d %b %Y %H:%M:%S %z')
    
    stamp = t.timestamp()
    stored_zone = t.tzinfo
    
    t2 = datetime.datetime.fromtimestamp(stamp, tz=stored_zone)
    

    这将再次生成等效的datetime 对象,具有相同的时区,所以t == t2

    t3 = datetime.datetime.fromtimestamp(stamp, tz=datetime.timezone.utc)
    

    这将再次生成相同的日期时间,但在 UTC 时区,所以它会显示为 16:20 但在内部它是相同的时间,仍然是t == t3!!!只是时区不同,但都代表同一时间。

    时区令人困惑。我建议多次阅读文档并测试所有内容。或者只使用 pytz。

    【讨论】:

    • 那么我传入 -0500 的内容与 python 正在转换的内容无关?
    • @dataviews 我不明白这个问题。您在字符串中传递了 -0500。 strptime 对其进行了解析并将负五小时的时区信息添加到日期时间。什么不正确?
    • 我现在已经添加了我的代码。当我运行我的代码时,-0500 给出 +1 小时,而不是负 5 小时。
    • @dataviews 准确地说,11 是 16 - 5;因此,当您将时区更改为 UTC 时,您会得到 16!
    • TIME -0500 表示 TIME 与格林威治 UTC 相比处于负 5 小时的时区 - 这意味着 TIME 比 UTC 晚 5 小时。如果您使用 UTC,则必须在 TIME 上增加 5 小时才能获得 NEW_TIME -0000 (UTC)
    猜你喜欢
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多