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)
它在这里正确生成了时区
>>> 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。
| 归档时间: |
|
| 查看次数: |
248 次 |
| 最近记录: |