测试日期时间是否已正确转换为UTC

时间:2019-03-21 02:34:05

标签: python python-3.x timezone pytz

尝试编写测试以查看我的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))中更改分钟值,但是在第二个测试中未更改分钟。 (我理解为什么两个示例之间的 hours 不同)。

1 个答案:

答案 0 :(得分:2)

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

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

这是因为时区可能会更改,并且pytz区域对象包含整个历史记录,因此需要针对正确的时间段进行配置。简单的replace不允许这样做。在那些古老的历史时期中,有些分钟会偏移奇数。