【问题标题】:Test if datetime was converted to UTC correctly测试日期时间是否正确转换为 UTC
【发布时间】:2019-08-11 20:48:19
【问题描述】:

尝试编写测试以查看我的datetime 转换是否正常工作并获得一些意想不到的结果。

import pytz
from datetime import datetime


def format_datetime(dt):
    if not dt.tzinfo:
        raise pytz.UnknownTimeZoneError('timezone not set')
    time = dt.astimezone(pytz.utc).strftime('%Y-%m-%dT%H:%M:%S')
    millis = dt.microsecond / 1000
    string = '{}{}'.format(time, '.%03dZ' % millis)

    return string


dt = datetime(2019, 3, 20, 1, 1, 1, 1)

# test 1
utc_dt = dt.replace(tzinfo=pytz.utc)
pdt_dt = dt.replace(tzinfo=pytz.timezone('America/Los_Angeles'))

print(format_datetime(utc_dt)) # 2019-03-20T01:01:01.000Z
print(format_datetime(pdt_dt)) # 2019-03-20T08:54:01.000Z

# test 2
utc_dt2 = dt.replace(tzinfo=pytz.utc)
pdt_dt2 = utc_dt2.astimezone(pytz.timezone('America/Los_Angeles'))

print(format_datetime(utc_dt2)) # 2019-03-20T01:01:01.000Z
print(format_datetime(pdt_dt2)) # 2019-03-20T01:01:01.000Z

我不明白为什么,在第一次测试中print(format_datetime(pdt_dt)) 更改了分钟值,但在第二次测试中分钟没有更改。 (我理解为什么两个示例的 小时数 不同)。

【问题讨论】:

    标签: python python-3.x timezone pytz


    【解决方案1】:

    您不能只将pytz 时区分配给datetime,您必须使用localizeastimezone

    utc_dt = pytz.utc.localize(dt)
    pdt_dt = utc_dt.astimezone(pytz.timezone('America/Los_Angeles'))
    

    这是因为时区可能会发生变化,pytz 时区对象包含整个历史记录,需要针对正确的时间段进行配置。一个简单的replace 不允许这样做。其中一些旧的历史时期会有奇数分钟偏移。

    【讨论】:

      猜你喜欢
      • 2020-10-11
      • 2021-12-07
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      • 2021-12-31
      • 2012-10-07
      • 1970-01-01
      相关资源
      最近更新 更多