Python 测试datetime是否正确转换为UTC

Python 测试datetime是否正确转换为UTC,python,python-3.x,timezone,pytz,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:

正在尝试编写一个测试,以查看我的
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\u datetime(pdt\u dt))
会更改分钟值,但在第二个测试中,分钟没有更改。(我理解为什么这两个例子的时间不同)。

你不能只将
pytz
时区分配给
datetime
,你必须使用
localize
astimezone

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

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

您不能将
pytz
时区分配给
datetime
,您必须使用
本地化
astimezone

utc_dt = pytz.utc.localize(dt)
pdt_dt = utc_dt.astimezone(pytz.timezone('America/Los_Angeles'))
这是因为时区可能会发生更改,而
pytz
zone对象包含整个历史记录,需要针对正确的时间段进行配置。简单的
replace
不允许这样做。一些旧的历史时期会有奇数分钟的偏移量