【问题标题】:Python Datetime Timezone ShiftPython 日期时间时区偏移
【发布时间】:2021-12-19 03:33:32
【问题描述】:

我有一个从 MQTT 代理传播的时间字符串,我想读取它并将其从其本地时区(美国中部时间)转换为协调世界时 (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>)

似乎尽管在初始时间戳转换中明确定义了“美国/中部”,但随后提供的初始时间减去了 5 小时。

我可以采取哪些额外的步骤/更改来确保提供的初始时间保持不变,定义为美国/中部时间,并且我可以随后更改为 UTC?

【问题讨论】:

    标签: python-3.x datetime timezone timezone-offset pytz


    【解决方案1】:

    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,因此您只需要标准库。

    【讨论】:

    • 很好的解释,考虑到假设是 UNIX 并且 Pytz 是在没有本地化的情况下使用的(这应该更快地提示我),这是有道理的。我接受你的回答,+1 提醒 zoneinfo 以及 Python 3.9。
    猜你喜欢
    • 1970-01-01
    • 2013-09-13
    • 2023-03-24
    • 2011-05-18
    • 2018-03-15
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 2017-03-31
    相关资源
    最近更新 更多