Как работать с 'timezone aware' datetime в Python: PST, UTC-8

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Знакомьтесь с pytz — вашим помощником для работы с временными зонами. Для работы с значениями даты и времени, осведомлёнными о временной зоне, можно использовать datetime.now() совместно с библиотекой pytz:

Python
Скопировать код
from datetime import datetime
import pytz

# "Осведомлённый" объект datetime
aware_datetime = datetime.now(pytz.timezone("UTC"))
print(aware_datetime)  # Какое сейчас время?

Просто замените "UTC" на нужное название временной зоне, например, "America/New_York", чтобы получить актуальное время в данном регионе.

Кинга Идем в IT: пошаговый план для смены профессии

Установка текущего времени в формате UTC

Если вы часто работаете в формате UTC, то для получения текущего времени можно воспользоваться методом datetime.utcnow().replace(tzinfo=pytz.utc):

Python
Скопировать код
from datetime import datetime
import pytz

# UTC всегда под рукой
utc_aware_datetime = datetime.utcnow().replace(tzinfo=pytz.utc)
print(utc_aware_datetime)

Указываем временную зону чтобы избежать путаницы

Всегда явно указывайте временные зоны при работе с датами и временем, чтобы избежать любых недоразумений:

Python
Скопировать код
# Пусть временной зоне Los Angeles будет уделено внимание
la_time = datetime.now(pytz.timezone('America/Los_Angeles'))
print(la_time)  # Привет, Лос-Анджелес! Какие новости?

Учет перехода на летнее время в Python

Мир полон неожиданностей, таких как летнее время (DST). Однако библиотеки pytz и zoneinfo (начиная с Python 3.9+) помогут вам использовать актуальную базу данных IANA временных зон:

Python
Скопировать код
from datetime import datetime, timezone
from zoneinfo import ZoneInfo

# Точное текущее время с учётом ZoneInfo
pst_aware_datetime = datetime.now(ZoneInfo("America/Los_Angeles"))

Помните, что операции с датами и временем выполнены в формате UTC наиболее надежно.

Не судите о классе tzinfo по его размеру

Создание пользовательского класса tzinfo обеспечит универсальность работы с временными зонами в различных контекстах. Размер значения здесь не главное:

Python
Скопировать код
# Создайте свой миниатюрный, но функциональный класс tzinfo.

Преимущества Python: стандартная поддержка временных зон

Уже начиная с версии Python 3.2, можно использовать встроенный модификатор datetime.timezone.utc для создания "осведомлённых" объектов datetime, без подключения сторонних библиотек:

Python
Скопировать код
from datetime import datetime, timezone

utc_aware_datetime = datetime.now(timezone.utc)
print(utc_aware_datetime)  # Просто и понятно, как и подобает Python 3.2+

Визуализация

Представьте себе настройку часов (🕰️) для отображения всемирного времени (🌐):

Markdown
Скопировать код
Местное время по часам (🕰️): 12:00 PM

При учете временной зоны ваши часы преобразуются в навигатор по мировому времени (🧭). Разные города, одно и то же время:

Python
Скопировать код
from datetime import datetime
import pytz

# Часы принимают во внимание временные зоны!
aware_datetime = datetime.now(pytz.utc)

Таким образом, "часы" могут отображать:

Markdown
Скопировать код
Всемирное время по часам (🕰️🌐): 12:00 PM UTC

При таком уровне точности преодолеваются границы пространства и времени.

Советы и подводные камни

  • Производительность: Будьте внимательны при работе с временными зонами на границах дней. Ваши действия могут влиять на производительность системы.
  • Управление данными: Храните все данные в UTC в базе данных. При необходимости вы можете конвертировать время в локальное для пользователя.
  • Актуальность: pytz и zoneinfo требуют регулярных обновлений. Для этого можно использовать пакет tzdata.
  • Пользовательские данные: Очень важно чётко интерпретировать пользовательские данные с учетом временных зон.
  • Точность до секунды: Удивительно, но datetime не поддерживает учет секунд. Если вам требуется сверхточность, возможно, придётся искать альтернативные решения.

Полезные материалы

  1. datetime — Базовые типы для работы с датой и временем — Документация Python 3.12.1 — основное руководство по работе с датой и временем в Python.
  2. pytz · PyPI — определения мировых временных зон в один клик.
  3. Arrow: Улучшенная работа с датой и временем в Python — Документация Arrow 🏹 1.3.0 — упрощает манипуляции со временем.
  4. dateutil – простое расширение возможностей datetime — документация dateutil 2.8.2 — когда дефолтному модулю datetime требуется помощник, готовый прийти на помощь dateutil.
  5. ISO – ISO 8601 —Стандарт формата даты и времени — это унификация даты и времени.
  6. База данных временных зон — всегда актуальное время для обработки данных, зависящих от времени.