Я имею дело с моим худшим кошмаром - часовыми поясами и летним временем.Я уже прочитал много постов на 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
, но яМне интересно, есть ли лучший способ / пакет / форматировщик, который может сделать это более логичным способом.