У меня есть экземпляр даты и времени Python, который был создан с использованием datetime.utcnow () и сохранился в базе данных.
Для отображения я хотел бы преобразовать экземпляр datetime, извлеченный из базы данных, в локальный datetime, используя местный часовой пояс по умолчанию (то есть, как если бы datetime был создан с использованием datetime.now ()).
Как я могу преобразовать дату и время UTC в локальную дату, используя только стандартную библиотеку python (например, без зависимости от pytz)?
Кажется, одним из решений было бы использовать datetime.astimezone (tz), но как бы вы получили местный часовой пояс по умолчанию?
python
datetime
timezone
python-datetime
Нитро жарк
источник
источник
Ответы:
В Python 3.3+:
В Python 2/3:
Используя
pytz
(оба Python 2/3):пример
Вывод
Python 3.3 Python 2 pytzПримечание: он учитывает летнее время и недавнее изменение смещения utc для часового пояса MSK.
Я не знаю, работают ли не-pytz-решения на Windows.
источник
.normalize()
поскольку источником часового пояса.astimezone()
является UTC.TypeError: replace() takes no keyword arguments
при попытке решения pytz.local_dt.replace(tzinfo=None).astimezone(tz=timezone.utc)
Вы не можете сделать это только со стандартной библиотекой, поскольку стандартная библиотека не имеет часовых поясов. Вам нужно pytz или dateutil .
Или же, вы можете сделать это без pytz или dateutil, внедрив свои собственные часовые пояса. Но это было бы глупо.
источник
Вы не можете сделать это со стандартной библиотекой. С помощью модуля pytz вы можете конвертировать любой наивный / осведомленный объект datetime в любой другой часовой пояс. Давайте посмотрим некоторые примеры использования Python 3.
Чтобы преобразовать наивный объект в любой другой часовой пояс, сначала вы должны преобразовать его в осведомленный объект datetime. Вы можете использовать
replace
метод для преобразования наивного объекта datetime в осведомленный объект datetime. Затем, чтобы преобразовать осведомленный объект datetime в любой другой часовой пояс, вы можете использоватьastimezone
метод.Переменная
pytz.all_timezones
дает вам список всех доступных часовых поясов в модуле pytz.Так как
now
метод возвращает текущую дату и время, вам необходимо сначала узнать о часовом поясе объекта datetime.localize
Функция конвертирует наивные объект DateTime в часовой пояс-Aware объект даты и времени. Затем вы можете использоватьastimezone
метод, чтобы преобразовать его в другой часовой пояс.источник
Я думаю, я понял это: вычисляет количество секунд с начала эпохи, затем преобразует в локальный тимзеон, используя time.localtime, а затем преобразует структуру времени обратно в datetime ...
Применяет летнее / зимнее летнее время правильно:
источник
utctotimestamp(utc_dt) -> (seconds, microseconds)
из вашего кода для ясности, см. реализацию Python 2.6-3.xОпираясь на комментарии Алексея. Это должно работать и для летнего времени.
источник
Стандартная библиотека Python вообще не поставляется с какими-либо
tzinfo
реализациями. Я всегда считал это удивительным недостатком модуля datetime.Документация для класса tzinfo приходит с некоторыми полезными примерами. Ищите большой блок кода в конце раздела.
источник
os
Модуль мог бы обеспечить один для местного времени на основе операционных функций системы.Python 3.9 добавляет
zoneinfo
модуль, так что теперь это можно сделать следующим образом (только stdlib):Центральная Европа на 1 или 2 часа опережает UTC, поэтому
local_aware
:как
str
:Windows не имеет базы данных системного часового пояса, поэтому здесь необходим дополнительный пакет:
Существует бэкпорт, позволяющий использовать в Python 3.6 до 3.8 :
Затем:
источник
zoneinfo
здесь даже не нужно - смотрите первую часть ответа jfs (часть Python3.3 +) ;-)ZoneInfo('localtime')
это намного понятнееtz=None
(в конце концов, можно ожидатьtz=None
удаления часового пояса или возврата UTC, а не местного времени).Простой (но, возможно, ошибочный) способ, который работает в Python 2 и 3:
Его преимущество в том, что написать обратную функцию тривиально
источник
time.timezone
не учитывает переход на летнее время.Самый простой способ, который я нашел, это получить смещение времени, в котором вы находитесь, а затем вычесть это из часа.
Это работает для меня, в Python 3.5.2.
источник
Вот еще один способ изменить часовой пояс в формате datetime (я знаю, что потратил впустую свою энергию на это, но я не видел эту страницу, поэтому я не знаю как) без мин. и сек. потому что мне это не нужно для моего проекта:
источник
Это ужасный способ сделать это, но он избегает создания определения. Он удовлетворяет требованию придерживаться базовой библиотеки Python3.
источник
Используйте timedelta для переключения между часовыми поясами. Все, что вам нужно, это смещение в часах между часовыми поясами. Не нужно возиться с границами для всех 6 элементов объекта datetime. Timedelta легко справляется с високосными годами, високосными веками и т. д. Вы должны сначала
Тогда, если
offset
это дельта часового пояса в часах:timeout = timein + timedelta(hours = offset)
где timein и timeout являются объектами datetime. например
timein + timedelta(hours = -8)
конвертирует из GMT в PST.
Итак, как определить
offset
? Вот простая функция, при условии, что у вас есть только несколько возможностей для конвертации без использования объектов даты и времени, которые «знают» часовой пояс, что приятно делать другим ответам. Немного ручной, но иногда ясность лучше.Изучив многочисленные ответы и поиграв с самым коротким кодом, который я могу себе представить (на данный момент), кажется, что лучше всего, чтобы все приложения, где важно учитывать время и смешанные часовые пояса, приложили реальные усилия для создания всех объектов даты и времени. «знают». Тогда, казалось бы, самый простой ответ:
конвертировать в GMT, например. Конечно, для преобразования в / из любого другого часового пояса, который вы хотите, локального или иного, просто используйте соответствующую строку часового пояса, которую понимает pytz (из pytz.all_timezones). Летнее время также учитывается.
источник