Проверьте, правильно ли было преобразовано время и дата в UTC - PullRequest
0 голосов
/ 21 марта 2019

Попытка написать тест, чтобы проверить, работают ли мои 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)) меняет значение минут, но во втором тесте минуты не меняются. (Я понимаю, почему часы отличаются между двумя примерами).

1 Ответ

2 голосов
/ 21 марта 2019

Вы не можете просто назначить pytz часовой пояс для datetime, вы должны использовать localize или astimezone:

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

Это связано с тем, что часовые пояса могут быть изменены, а объекты зоны pytz содержат всю историю и должны быть настроены на правильный период времени. Простой replace не позволяет этого. Некоторые из этих старых исторических периодов будут иметь смещение нечетного числа минут.

...