Python 日期时间时区转换

Python Datetime Timezone Shift

我有一个从 MQTT 代理传播的时间字符串,我想读取它并将其从其本地时区(U.S。中央时间)转换为协调世界时 (UTC)。我目前在 Ubuntu 20.04 Focal Fossa 中使用 Python 3.8.5,机器时区设置为 UTC。

时间字符串如下:1636039288.815212

为了在 Python 中使用这个时间,我结合使用了 datetime 和 pytz 库。我目前的核心代码如下:

from datetime import datetime, timedelta
import pytz

input = 1636039288.815212
srctime = datetime.fromtimestamp(input, tz=pytz.timezone('US/Central'))

在 运行 这个块之后,我收到以下不需要的时间输出:

datetime.datetime(2021, 11, 4, 10, 21, 28, 815212, tzinfo=<DstTzInfo 'US/Central' CDT-1 day, 19:00:00 DST>)

尽管在初始时间戳转换中明确定义了 'US/Central',但随后提供的初始时间减去了 5 小时。

我可以做些什么额外的 steps/alterations 来确保提供的初始时间不变,定义为 US/Central,并且我可以随后更改为 UTC?

Python 的 fromtimestamp 假设您的输入是 UNIX time,它应该指的是 1970-01-01 UTC,而不是某个任意时区。如果你仍然遇到这样的事情(另一个纪元时区),你需要设置 UTC 然后 replace tzinfo:

from datetime import datetime
from dateutil import tz # pip install python-dateutil

ts = 1636039288.815212

dt = datetime.fromtimestamp(ts, tz=tz.UTC).replace(tzinfo=tz.gettz("US/Central"))

print(dt)
# 2021-11-04 16:21:28.815212-05:00

# or in UTC:
print(dt.astimezone(tz.UTC))
# 2021-11-04 20:21:28.815212+00:00

请注意,我在这里使用 dateutil 以便替换操作是安全的。不要用 pytz 这样做(你必须在那里使用 localize)。升级到 Python 3.9 或更高版本后,请改用 zoneinfo,因此您只需要标准库。