【问题标题】:Python datetime parsing timestamp with timezonePython datetime用时区解析时间戳
【发布时间】:2021-07-25 09:45:09
【问题描述】:

不久前我遇到了这个问题,在解析带有时区数据的 ISO 字符串和解析时间戳(假设是同一时间)会产生不同的结果。我已经编写了一个测试来检查这种行为,它似乎非常不一致:

from pytz import timezone as tz
from datetime import datetime

timezone = "Australia/Sydney"
start_time = "2021-05-04T08:12:00"
tz_object = tz(timezone)
naive_datetime = datetime.fromisoformat(start_time)


zoned_time = datetime(naive_datetime.year, naive_datetime.month, naive_datetime.day, naive_datetime.hour, naive_datetime.minute, naive_datetime.second, tzinfo=tz_object)
parsed_time = datetime.fromtimestamp(zoned_time.timestamp(), tz_object)

assert zoned_time.time() == naive_datetime.time()
assert zoned_time.time() == parsed_time.time()

此测试产生以下输出

  File "test.py", line 13, in <module>
    assert zoned_time.time() == parsed_time.time()
  AssertionError

除非我遗漏了什么,否则我只能断定这一行所产生的时间

parsed_time = datetime.fromtimestamp(zoned_time.timestamp(), tz_object)

生成的时间与解析实际 ISO 字符串不同。通常,我希望解析时间的时间戳返回一个时间戳,该时间戳指的是分配给它的时区的上午 8:12。

这是预期的行为吗? 我错过了什么吗?

【问题讨论】:

    标签: python-3.x datetime timestamp timezone


    【解决方案1】:

    对于 Python 3.9,使用 zoneinfo。请注意,如果需要,pytz 有一个弃用 shim。

    然后你的代码就可以正常工作了

    from datetime import datetime
    from zoneinfo import ZoneInfo
    
    timezone = "Australia/Sydney"
    tz_object = ZoneInfo(timezone)
    
    start_time = "2021-05-04T08:12:00"
    naive_datetime = datetime.fromisoformat(start_time)
    
    zoned_time = datetime(naive_datetime.year, naive_datetime.month, naive_datetime.day, naive_datetime.hour, naive_datetime.minute, naive_datetime.second, tzinfo=tz_object)
    parsed_time = datetime.fromtimestamp(zoned_time.timestamp(), tz_object)
    
    assert zoned_time.time() == naive_datetime.time()
    assert zoned_time.time() == parsed_time.time()
    

    至于为什么你得到一个断言错误:使用pytz你需要localize带有时区的日期时间对象; 永远不要直接用 pytz 设置 tzinfo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      • 2015-08-03
      相关资源
      最近更新 更多