Преобразование и форматирование часовых поясов - PullRequest
0 голосов
/ 12 февраля 2019

Я имею дело с моим худшим кошмаром - часовыми поясами и летним временем.Я уже прочитал много постов на stackoverflow, но я все еще не могу понять это.Вот проблема: я делаю запрос API для того, что должно быть UTC данных за один день, но система, с которой я работаю, нуждается в запросе в США / Тихоокеанском времени.Документация гласит:

  • Часовой пояс поддерживается для фильтрации диапазона отчета, но все ответы возвращаются в часовом поясе Тихоокеанского региона США, соответственно измените конец летнего времени.

  • Для вызовов API после начала летнего времени должно быть добавлено -07: 00, а после окончания летнего времени должно быть добавлено -08: 00

  • 2018 Переход на летнее время начинается в воскресенье, 11 марта 2018 года.в 2 часа ночи.

    • API-вызовы до 11 марта должны иметь следующий синтаксис: &start=2017-03-10T00:00:00-08:00&end=2017-03-10T23:59:59-08:00

    • API-вызов для фактического дняЛетнее время должно иметь следующий синтаксис: &start=2018-03-11T00:00:00-08:00&end=2017-03-11T23:59:59-07:00

Помимо запутанной смеси 2017 и 2018 годов, нет фактического параметра для указания нужного часового пояса.но вы должны настроить данные в следующем формате: 2018-03-11T00:00:00-08:00.

Для меня это выглядит как формат ISO, но я потратил довольно много времени, пытаясь получить yyyy-MM-dd'T'HH:mm:ssXXX, а не 'yyyy-MM-dd'T'HH:mm:ss.SSSXXX' ине мог сделать эту работу.Поэтому я создал следующий обходной путь:

def dst_calc(single_date):
    zone = pytz.timezone("US/Pacific")
    day = single_date.strftime("%Y-%m-%d")

    tdelta_1 = datetime.strptime('2:00:00', '%H:%M:%S') - datetime.strptime('1:00:00', '%H:%M:%S')
    tdelta_0 = datetime.strptime('1:00:00', '%H:%M:%S') - datetime.strptime('1:00:00', '%H:%M:%S')

    logger.info('check for DST')
    if zone.localize(datetime(single_date.year, single_date.month, single_date.day)).dst() == tdelta_1:
        logger.info('summertime')
        start = single_date.strftime("%Y-%m-%d") + "T00:00:00-07:00"
        end = single_date.strftime("%Y-%m-%d") + "T23:59:59-07:00"
    elif zone.localize(datetime(single_date.year, single_date.month, single_date.day) + timedelta(days=1)).dst() == tdelta_1:
        logger.info('beginning of summertime')
        start = single_date.strftime("%Y-%m-%d") + "T00:00:00-08:00"
        end = single_date.strftime("%Y-%m-%d") + "T23:59:59-07:00"
    elif zone.localize(datetime(single_date.year, single_date.month, single_date.day)).dst() == tdelta_0:
        logger.info('wintertime')
        start = single_date.strftime("%Y-%m-%d") + "T00:00:00-08:00"
        end = single_date.strftime("%Y-%m-%d") + "T23:59:59-08:00"

Очевидно, что это только в часовом поясе США / Тихого океана, и чтобы получить день UTC, мне нужно вычесть разницу в 8 часов от начальной и 8 временных отметок, т.е. иметь T16:00:00-08:00, но яМне интересно, есть ли лучший способ / пакет / форматировщик, который может сделать это более логичным способом.

1 Ответ

0 голосов
/ 12 февраля 2019

Вы можете использовать метод datetime astimezone для определения правильных часов.

import datetime, pytz
now = datetime.datetime.now() # datetime.datetime(2019, 2, 12, 17, 0, 0, 0)

now.astimezone(pytz.utc)
# datetime.datetime(2019, 2, 12, 16, 0, 0, 0, tzinfo=<UTC>)

now.astimezone(pytz.timezone('US/Pacific'))
# datetime.datetime(2019, 2, 12, 8, 0, 0, 0, tzinfo=<DstTzInfo 'US/Pacific' PST-1 day, 16:00:00 STD>)
...