python日期时间格式混乱

dat*_*ews 1 python timezone datetime python-3.x

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

Wed, 27 Jun 2018 11:20:33 -0500
Run Code Online (Sandbox Code Playgroud)

如果我们使用 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'))
Run Code Online (Sandbox Code Playgroud)

nos*_*klo 6

它在这里正确生成了时区

>>> 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)))
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

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

t3 = datetime.datetime.fromtimestamp(stamp, tz=datetime.timezone.utc)
Run Code Online (Sandbox Code Playgroud)

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

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

  • @dataviews 我不明白这个问题。您在字符串中传递了 -0500。`strptime` 解析它并将负五小时的时区信息添加到日期时间。什么是不正确的? (2认同)