Python получает текущее время в правильном часовом поясе
Прямо сейчас я использую
import datetime
print(datetime.datetime.now().strftime("%X"))
для отображения текущего времени в виде строки.
Проблема в том, что мой компьютер работает в часовом поясе Europe/Berlin
, и смещение +2 в UTC здесь не учитывается.
Вместо 19:22:26
должно отображаться 21:22:26
Также отличается от других ответов, которые я нашел здесь, я не храню его, звоня
datetime.datetime(2014, 7, 10, 18, 44, 59, 193982, tzinfo=<UTC>)
но
datetime.datetime.now()
поэтому я попытался (и не смог) сделать следующее:
>>> from pytz import timezone
>>> datetime.datetime.now().astimezone(timezone('Europe/Berlin'))
ValueError: astimezone() cannot be applied to a naive datetime
Изменить:
Ответ
Не могу опубликовать как ответ, так как этот вопрос помечен как закрытый
Сервер, с которым у меня возникла эта проблема, больше не существует.
Во всяком случае, вот некоторые другие вещи, которые стоит проверить:
- Правильно ли настроен часовой пояс вашего сервера/системы?
- Виртуальные машины или док-контейнеры могут быть не синхронизированы с хостом, это стоит проверить.
- Время на этом компьютере правильное? У вас не осталось +2 часов после смены часового пояса?
Ответы
Ответ 1
Чтобы получить текущее время в локальном часовом поясе как наивный объект datetime:
from datetime import datetime
naive_dt = datetime.now()
Если он не возвращает ожидаемое время, значит, ваш компьютер неправильно настроен. Сначала вы должны исправить это (это не связано с Python).
Чтобы получить текущее время в UTC как наивный объект datetime:
naive_utc_dt = datetime.utcnow()
Чтобы получить текущее время как знающий объект datetime в Python 3.3 +:
from datetime import datetime, timezone
utc_dt = datetime.now(timezone.utc) # UTC time
dt = utc_dt.astimezone() # local time
Чтобы получить текущее время в данном часовом поясе из базы данных tz:
import pytz
tz = pytz.timezone('Europe/Berlin')
berlin_now = datetime.now(tz)
Он работает во время переходов DST. Он работает, если в часовом поясе было другое смещение UTC в прошлом, то есть оно работает, даже если временной интервал соответствует нескольким объектам tzinfo в разное время.