Стрелка Python неправильно форматирует дату
Я использую пакет Python Arrow для форматирования полученной даты.
Мой вклад:
datetime=2017-10-01T00:10:00Z and timezone=US/Pacific
Мой ожидаемый результат:
Sun 10/01 @ 6:10pm
Я пробовал множество различных преобразований даты и времени, но всегда получаю Sun 10/01 @ 12:10AM
который не зависит от часового пояса.
Если я попытаюсь сказать:
x = arrow.Arrow.strptime('2017-10-01T00:10:00Z',
'%Y-%m-%dT%H:%M:%SZ',
tzinfo=tz.gettz('US/Pacific'))
x
равно:
<Arrow [2017-10-01T00:10:00-07:00]>
Я тогда говорю:
x.strftime('%a %m/%d @ %I:%M%p')
и это выводит
Sun 10/01 @ 12:10AM
Arrow
объект знает о часовом поясе, о чем свидетельствует -7:00
но не форматирует дату соответственно.
Есть идеи?
1 ответ
Я думаю, что в этом вопросе есть несколько недоразумений.
Преобразовать в часовой пояс
Я не вижу, что отметка времени,
2017-10-01T00:10:00Z and timezone=US/Pacific
Может стать,
Sun 10/01 @ 6:10pm
Здесь есть несколько проблем.
- Z в конце временной метки является часовой пояс и означает
Zulu
он же GMT, поэтому у временной метки уже есть часовой пояс. - Если мы проигнорируем проблему № 1, то для того, чтобы отметка времени 10 минут после полуночи (минус Z) стала 6:10 вечера того же дня, потребуется часовой пояс +18. Этот часовой пояс не существует.
- США / Тихий океан составляет -7/-8 в зависимости от времени года. Если мы примем Z в качестве часового пояса и хотим преобразовать в США / Тихий океан, то время должно быть 9/31 в 5:10 вечера.
Что означает -7:00?
Итак, я собираюсь догадаться, что вы намереваетесь в том, что отметка времени на самом деле является Zulu, и вы хотите отобразить эту отметку как US/Pacific. Если это правда, то вам нужно сделать:
from dateutil import tz
import arrow
x = arrow.Arrow.strptime(
'2017-10-01T00:10:00Z',
'%Y-%m-%dT%H:%M:%SZ').to(tz.gettz('US/Pacific'))
print(x)
print(x.strftime('%a %m/%d @ %I:%M%p'))
Это приводит к:
2017-09-30T17:10:00-07:00
Sat 09/30 @ 05:10PM
Как вы заметили ранее, вы заметите, что они производятся одновременно. Разница в том, что первый также имеет -7:00. Как вы отметили в своем вопросе, это не означает, что для отображения времени, как в часовом поясе, нужно удалить 7 часов, вместо этого это означает, что метка времени уже удалила 7 часов из Зулу.