测试日期时间是否正确转换为 UTC
Test if datetime was converted to UTC correctly
正在尝试编写测试以查看我的 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))
更改了分钟值,但在第二个测试中分钟没有改变。 (我理解为什么 小时 在两个示例之间是不同的)。
您不能只将 pytz
时区分配给 datetime
,您必须使用 localize
或 astimezone
:
utc_dt = pytz.utc.localize(dt)
pdt_dt = utc_dt.astimezone(pytz.timezone('America/Los_Angeles'))
这是因为时区可能会发生变化,而 pytz
时区对象包含整个历史记录,需要针对正确的时间段进行配置。一个简单的 replace
不允许这样做。一些旧的历史时期会有奇数分钟偏移。
正在尝试编写测试以查看我的 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))
更改了分钟值,但在第二个测试中分钟没有改变。 (我理解为什么 小时 在两个示例之间是不同的)。
您不能只将 pytz
时区分配给 datetime
,您必须使用 localize
或 astimezone
:
utc_dt = pytz.utc.localize(dt)
pdt_dt = utc_dt.astimezone(pytz.timezone('America/Los_Angeles'))
这是因为时区可能会发生变化,而 pytz
时区对象包含整个历史记录,需要针对正确的时间段进行配置。一个简单的 replace
不允许这样做。一些旧的历史时期会有奇数分钟偏移。