尝试编写测试以查看我的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 不同)。
答案 0 :(得分:2)
您不能仅将pytz
时区分配给datetime
,而必须使用localize
或astimezone
:
utc_dt = pytz.utc.localize(dt)
pdt_dt = utc_dt.astimezone(pytz.timezone('America/Los_Angeles'))
这是因为时区可能会更改,并且pytz
区域对象包含整个历史记录,因此需要针对正确的时间段进行配置。简单的replace
不允许这样做。在那些古老的历史时期中,有些分钟会偏移奇数。