Как работать с 'timezone aware' datetime в Python: PST, UTC-8
Быстрый ответ
Знакомьтесь с pytz
— вашим помощником для работы с временными зонами. Для работы с значениями даты и времени, осведомлёнными о временной зоне, можно использовать datetime.now()
совместно с библиотекой pytz
:
from datetime import datetime
import pytz
# "Осведомлённый" объект datetime
aware_datetime = datetime.now(pytz.timezone("UTC"))
print(aware_datetime) # Какое сейчас время?
Просто замените "UTC" на нужное название временной зоне, например, "America/New_York", чтобы получить актуальное время в данном регионе.
Установка текущего времени в формате UTC
Если вы часто работаете в формате UTC, то для получения текущего времени можно воспользоваться методом datetime.utcnow().replace(tzinfo=pytz.utc)
:
from datetime import datetime
import pytz
# UTC всегда под рукой
utc_aware_datetime = datetime.utcnow().replace(tzinfo=pytz.utc)
print(utc_aware_datetime)
Указываем временную зону чтобы избежать путаницы
Всегда явно указывайте временные зоны при работе с датами и временем, чтобы избежать любых недоразумений:
# Пусть временной зоне Los Angeles будет уделено внимание
la_time = datetime.now(pytz.timezone('America/Los_Angeles'))
print(la_time) # Привет, Лос-Анджелес! Какие новости?
Учет перехода на летнее время в Python
Мир полон неожиданностей, таких как летнее время (DST). Однако библиотеки pytz
и zoneinfo
(начиная с Python 3.9+) помогут вам использовать актуальную базу данных IANA временных зон:
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
# Точное текущее время с учётом ZoneInfo
pst_aware_datetime = datetime.now(ZoneInfo("America/Los_Angeles"))
Помните, что операции с датами и временем выполнены в формате UTC наиболее надежно.
Не судите о классе tzinfo по его размеру
Создание пользовательского класса tzinfo обеспечит универсальность работы с временными зонами в различных контекстах. Размер значения здесь не главное:
# Создайте свой миниатюрный, но функциональный класс tzinfo.
Преимущества Python: стандартная поддержка временных зон
Уже начиная с версии Python 3.2, можно использовать встроенный модификатор datetime.timezone.utc
для создания "осведомлённых" объектов datetime
, без подключения сторонних библиотек:
from datetime import datetime, timezone
utc_aware_datetime = datetime.now(timezone.utc)
print(utc_aware_datetime) # Просто и понятно, как и подобает Python 3.2+
Визуализация
Представьте себе настройку часов (🕰️) для отображения всемирного времени (🌐):
Местное время по часам (🕰️): 12:00 PM
При учете временной зоны ваши часы преобразуются в навигатор по мировому времени (🧭). Разные города, одно и то же время:
from datetime import datetime
import pytz
# Часы принимают во внимание временные зоны!
aware_datetime = datetime.now(pytz.utc)
Таким образом, "часы" могут отображать:
Всемирное время по часам (🕰️🌐): 12:00 PM UTC
При таком уровне точности преодолеваются границы пространства и времени.
Советы и подводные камни
- Производительность: Будьте внимательны при работе с временными зонами на границах дней. Ваши действия могут влиять на производительность системы.
- Управление данными: Храните все данные в UTC в базе данных. При необходимости вы можете конвертировать время в локальное для пользователя.
- Актуальность:
pytz
иzoneinfo
требуют регулярных обновлений. Для этого можно использовать пакетtzdata
. - Пользовательские данные: Очень важно чётко интерпретировать пользовательские данные с учетом временных зон.
- Точность до секунды: Удивительно, но
datetime
не поддерживает учет секунд. Если вам требуется сверхточность, возможно, придётся искать альтернативные решения.
Полезные материалы
- datetime — Базовые типы для работы с датой и временем — Документация Python 3.12.1 — основное руководство по работе с датой и временем в Python.
- pytz · PyPI — определения мировых временных зон в один клик.
- Arrow: Улучшенная работа с датой и временем в Python — Документация Arrow 🏹 1.3.0 — упрощает манипуляции со временем.
- dateutil – простое расширение возможностей datetime — документация dateutil 2.8.2 — когда дефолтному модулю datetime требуется помощник, готовый прийти на помощь dateutil.
- ISO – ISO 8601 —Стандарт формата даты и времени — это унификация даты и времени.
- База данных временных зон — всегда актуальное время для обработки данных, зависящих от времени.