Преобразование часового пояса datetime.time

#python #python-3.x #python-datetime #pytz #python-arrow

#питон #python-3.x #python-datetime #pytz #python-стрелка

Вопрос:

Я пишу код на Python, используя библиотеку arrow для преобразования часового пояса (который по умолчанию будет UTC) в строке (без даты) в другой часовой пояс.

Примерное строковое значение равно: 18:30 0000

Фрагмент кода выглядит следующим образом :

 start      = '18:30 0000'
start_time = arrow.get(start,'hh:mmZ')

print(start_time.format('hh:mm A ZZ'))

print(start_time.to('Australia/Melbourne').format('hh:mm A ZZ'))
# This should print 05:30 AM  11:00 - but showing 04:09 AM  09:39
 

Я также пытался преобразовать в другие часовые пояса.

 print(start_time.to('Europe/London').format('hh:mm A ZZ'))
# This should print 06:30 PM  00:00 - but showing 06:28 PM -00:01
 

Получение UTC сейчас, а затем преобразование его в другой часовой пояс работает отлично

 print(arrow.utcnow().to('Australia/Melbourne').format('hh:mm A ZZ'))
 

РЕШЕНИЕ:
Мы должны добавить временное значение даты для преобразования, если у нас нет значения даты.

 def convert_timezone(time_to_convert,timezone):
  time_to_convert='20111111 ' time_to_convert
  return arrow.get(time_to_convert).to(timezone)

print(convert_timezone('18:30 0000','Australia/Melbourne').format('hh:mm A ZZ'))
 

Комментарии:

1. преобразование часового пояса не имеет особого смысла только для времени, без даты (подумайте о DST). Я подозреваю, что стрелка возвращается к LMT (локальное среднее время) часового пояса, в который вы пытаетесь преобразовать. Попробуйте то же самое со строкой, которая включает дату, это должно работать правильно.

2. примечание: afaik, arrow внутренне использует dateutil , нет pytz .

3. Я понял вашу идею. По сути, логика заключалась в том, чтобы сохранять время с часовым поясом, когда пользователь доступен для собрания каждую неделю. Сохранение даты вместе со временем не помогло бы. Но логика, которую вы дали для LMT, верна, стрелка использовала LMT в качестве часового пояса.

4. да, сохранение даты не будет стоить вам всего нескольких байтов. Если это не имеет значения для пользователя, просто не печатайте его. Но внутренне вы захотите его иметь.

Ответ №1:

добавьте соответствующую дату во входную строку, и это сработает так, как вы ожидаете:

 import arrow

start = '2021-02-01 18:30 0000'
start_time = arrow.get(start)
print(start_time.to('Australia/Melbourne').format('hh:mm A ZZ'))
# 05:30 AM  11:00
 

Комментарии:

1. Должен ли я явно добавить какую-либо временную дату, чтобы преобразовать часовой пояс?

2. @Saqib: ну, это зависит от того, почему я написал соответствующую дату . Если у вас есть часовой пояс с DST, вы можете получить различное смещение UTC в зависимости от того, какую дату вы выберете.