Стрелка 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

Здесь есть несколько проблем.

  1. Z в конце временной метки является часовой пояс и означает Zulu он же GMT, поэтому у временной метки уже есть часовой пояс.
  2. Если мы проигнорируем проблему № 1, то для того, чтобы отметка времени 10 минут после полуночи (минус Z) стала 6:10 вечера того же дня, потребуется часовой пояс +18. Этот часовой пояс не существует.
  3. США / Тихий океан составляет -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 часов из Зулу.

Другие вопросы по тегам