Модуль pytz: уменьшение UTC вместо увеличения - PullRequest
0 голосов
/ 01 марта 2019

РЕДАКТИРОВАНИЕ: Я хочу конвертировать время UTC в моей стране UTC (Испания).Я использую модуль pytz, чтобы сделать преобразование, но в результате я получаю UTC-1, а не UTC + 1.Это мой код:

import datetime
import pytz

madrid = pytz.timezone("Europe/Madrid")
UTC_time = datetime.datetime.strptime("2019-03-01 14:45","%Y-%m-%d %H:%M")
madrid_dt = madrid.localize(UTC_time, is_dst=None)
MadridTime = madrid_dt.astimezone(pytz.utc).strftime ("%Y-%m-%d %H:%M")

И это вывод:

UTC_Time: 2019-03-01 14:45:00
MadridTime: 2019-03-01 13:45

Мне нужно, чтобы MadridTime вернул 15:45 вместо 13:45.Что я делаю не так?

РЕДАКТИРОВАНИЕ2: С вашей помощью я понял, что я путаю использование локализации и astimeszone.Теперь я сталкиваюсь с двумя новыми проблемами.Это новый код:

import datetime
import pytz

dt = datetime.datetime.strptime('2019-03-01 14:45','%Y-%m-%d %H:%M')

madrid_tz = pytz.timezone('Europe/Madrid')
madrid = dt.astimezone(madrid_tz)

print(madrid)
# 2019-03-01 14:45:00+01:00

print(madrid.strftime ("%Y-%m-%d %H:%M"))
# 2019-03-01 14:45

Проблема 1. При запуске этого кода в Windows 10, Python3, ожидаемый вывод был 2019-03-01 15:45:00, а не 2019-03-01 14:45:00+01:00.Я попытался отформатировать его с помощью strftime ("%Y-%m-%d %H:%M"), но это не помогло.

Проблема 2: Запуск этого кода в Raspberrypi (где я буду запускать код, когда я закончу), Python3, я получаюОшибка ValueEr в этой строке madrid = dt.astimezone(madrid_tz).Ошибка ValueError: astimezone() cannot be applied to a naive datetime

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Я думаю, что вы неправильно понимаете localize и astimezone, потому что вы создаете свой объект даты / времени 2019-03-01 14:45 в часовом поясе Европы / Мадрида с помощью localize, а затем конвертируете его в UTC с помощью astimezone, который дает вам неожиданный результат.

Вместо этого кажется, что вы хотите создать объект datetime на 2019-03-01 14:45, а затем хотите отобразить этот datetime в Европе / Мадридевремя и время UTC.Вы можете использовать astimezone или localize для получения желаемого результата.

astimezone пример:

import datetime
import pytz

dt = datetime.datetime.strptime('2019-03-01 14:45','%Y-%m-%d %H:%M')

madrid_tz = pytz.timezone('Europe/Madrid')
madrid = dt.astimezone(madrid_tz)
print(madrid)
# 2019-03-01 15:45:00+01:00

utc = dt.astimezone(pytz.utc)
print(utc)
# 2019-03-01 14:45:00+00:00

localize пример (обратите внимание, что объекты datetime создаются ввремя, которое соответствует каждому часовому поясу, так что оба будут представлять один и тот же момент времени):

import datetime
import pytz

madrid_tz = pytz.timezone('Europe/Madrid')
madrid = madrid_tz.localize(datetime.datetime(2019, 3, 1, 15, 45))
print(madrid)
# 2019-03-01 15:45:00+01:00

utc = pytz.utc.localize(datetime.datetime(2019, 3, 1, 14, 45))
print(utc)
# 2019-03-01 14:45:00+00:00
0 голосов
/ 01 марта 2019

Давайте немного поясним, что здесь:

madrid = pytz.timezone('Europe/Madrid')

Часовой пояс Европа / Мадрид, который является UTC + 1 / + 2.

naive_ts = datetime.strptime('2019-03-01 14:45', '%Y-%m-%d %H:%M')

Наивная временная метка безлюбой конкретный часовой пояс.

madrid_ts = madrid.localize(naive_ts)

Та же самая временная метка, теперь с прикрепленным часовым поясом Европа / Мадрид, т.е. 14: 45 в Мадриде (UTC + 1) .

utc_ts = madrid_ts.astimezone(pytz.utc)

То же время, что и 14: 45 в Мадриде (UTC + 1) в UTC, поэтому 14:45 - 1 час → 13:45. Все как положено. Если в Мадриде 14:45, то в UTC 13:45, потому что в Мадриде на час впереди UTC.

datetime.now()

то есть ... он не имеет ничего общего с двумя указанными выше временными метками и зависит от часового пояса по умолчанию на вашем компьютере и текущего времени, когда вы выполняете этот код.

...