Обработка даты/времени с учётом часового пояса в Python
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для сохранения сведений о часовом поясе используйте функцию parse
из библиотеки python-dateutil
. В отличие от strptime()
, входящей в стандартную библиотеку и создающей объекты без учета часового пояса, функция parse
корректно обрабатывает смещение часового пояса:
from dateutil import parser
dt = parser.parse("2023-02-20T14:30:00-05:00") # Экземпляр datetime с учетом часового пояса!
В этом случае функция parse
учитывает смещение -05:00
и возвращает "осведомленный" объект datetime.
Работа со strftime и strptime
С использованием strptime()
и директивы %z
можно получить объекты datetime, которые содержат информацию о часовом поясе:
from datetime import datetime
datetime_obj = datetime.strptime("2023-04-01T14:30:00-0500", "%Y-%m-%dT%H:%M:%S%z")
Рекомендуется избегать использование директивы %Z
с функцией strptime()
, поскольку она может вызвать ошибки из-за неоднозначности обозначений часовых поясов (например, «EST»).
Ручная настройка часового пояса в объекте datetime
Если для объектов datetime
используется известный фиксированный часовой пояс, можно вручную установить tzinfo
:
from datetime import datetime, timezone, timedelta
naive_datetime = datetime.strptime("2023-04-01 14:30:00", "%Y-%m-%d %H:%M:%S")
aware_datetime = naive_datetime.replace(tzinfo=timezone(timedelta(hours=-5)))
Данный подход подходит в случае, когда не требуется динамичный разбор часового пояса из строки.
Разбор временных меток электронной почты с помощью функции parsedate_tz
Функция parsedate_tz
из модуля email.utils
идеально приспособлена для работы с часовыми поясами в строках с датами из email:
from email.utils import parsedate_tz, mktime_tz
date_tuple = parsedate_tz('Mon, 20 Feb 2023 14:30:00 -0500')
timestamp = mktime_tz(date_tuple) # Получаем корректную Unix-метку времени
В результате получаем временную метку с учетом сведений о часовом поясе.
Оценка использования альтернативных библиотек
Помимо python-dateutil
, существуют другие библиотеки, например, pendulum
, предоставляющие дополнительные возможности для работы с часовыми поясами:
import pendulum
dt = pendulum.parse("2023-02-20T14:30:00-05:00")
Визуализация
Представьте себе стену с часами, где указаны часы для различных городов и их часовых поясов, чтобы убедиться в правильности часового пояса:
Стена мировых часов:
| Город | Время | Часовой пояс |
| ---------- | ------------ | -------------------------- |
| Нью-Йорк | 12:00 PM | EST 🗽 |
| Лондон | 05:00 PM | GMT 🎡 |
| Токио | 02:00 AM | JST 🗼 |
Чтобы установить часовой пояс для объекта datetime, можно также воспользоваться модулем pytz
:
from datetime import datetime
from pytz import timezone
new_york_time_str = "2023-04-01 12:00:00 EST"
pattern = "%Y-%m-%d %H:%M:%S %Z"
time_with_zone = timezone('US/Eastern').localize(datetime.strptime(new_york_time_str[:-4], pattern[:-3]))
Теперь у вас есть точное "время", синхронизированное с его часовым поясом.
Применение названий и смещений часовых поясов
Проверяйте сокращения различных часовых поясов. Чтобы вывести название часового пояса из объекта datetime, используйте функцию tzname()
:
from datetime import datetime, timezone
dt = datetime.now(timezone.utc)
print(dt.tzname()) # Выводит 'UTC'
Метод tzname()
помогает извлечь название часового пояса из "осведомленных" объектов.
Корректировка временных меток для специфических случаев
Временами потребовать корректировки временных меток, особенно при работе с неоднозначными аббревиатурами, например, EST
:
import pytz
timestamp = "2023-04-01 14:30:00 EST"
aus_tz = pytz.timezone('Australia/Sydney')
corrected_time = aus_tz.localize(datetime.strptime(timestamp, "%Y-%m-%d %H:%M:%S %Z"))
Полезные материалы
- datetime — Базовые типы даты и времени — Официальная документация Python по функциям
strptime()
иstrftime()
. - dateutil – расширения стандартного модуля datetime — Упрощенная работа с датами в Python.
- ISO 8601 – стандарт форматирования даты и времени — Википедия.
- Arrow: Даты и времена в Python без головной боли — Библиотека Python для работы с датами и временем.
- Документация Pendulum – удобство работы со временем в Python — Документация по API Pendulum для работы с datetime.
- Лучшие open-source инструменты для разработки 2024 — Подбор инструментов для работы с датами и временем.