Конвертация даты из UTC в локальное время Python: скрипт
Быстрый ответ
Для того, чтобы перевести Всемирное координированное время (UTC) в локальное, можно использовать модули datetime
и time
языка программирования Python. Ниже представлен пример кода:
import datetime
import time
utc_dt = datetime.datetime.utcnow() # Получаем актуальное время в UTC
local_dt = utc_dt – datetime.timedelta(seconds=time.timezone) # Конвертируем его в локальное время
if time.daylight:
local_dt += datetime.timedelta(seconds=time.altzone) # Если активно летнее время, учитываем это
print(f"Локальное время: {local_dt}") # Выводим локальное время на экран
Вот таким образом кусочек кода позволяет учесть летнее время и отобразить время с учётом временной зоны вашей операционной системы.
Подробное руководство по конвертации времени
Преобразование времени из формата UTC в локальное иногда напоминает игру в четырёхмерные шахматы из-за внесения изменений, связанных с переходом на летнее время, и разнообразия часовых поясов.
Встроенный модуль zoneinfo
в Python 3.9
С версии Python 3.9 разработчики добавили удобный инструмент для работы с временными зонами — модуль zoneinfo
:
from datetime import datetime, timezone
from zoneinfo import ZoneInfo # Данный модуль появился в Python стартуя с версии 3.9
utc_dt = datetime.now(timezone.utc)
local_dt = utc_dt.astimezone(ZoneInfo("localtime")) # Простое преобразование в локальное время
print(f"Локальное время: {local_dt}") # Выводим локальное время
Учет летнего времени
Не стоит забывать про изменения, связанные с переходом на летнее время:
from datetime import datetime, timezone, timedelta
import time
utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc)
local_dt = utc_dt.astimezone()
if time.localtime().tm_isdst:
local_dt = local_dt + local_dt.utcoffset() – timedelta(hours=1) # Корректировка времени на летнее время
print(f"Локальное время с учетом летнего времени: {local_dt}") # Итак, учтено летнее время
Для версий Python < 3.9
Если вы все еще используете более раннюю версию Python, вы можете воспользоваться модулем backports.zoneinfo
:
pip install backports.zoneinfo # Установка для старых версий Python
Используйте данный модуль также, как вы бы использовали zoneinfo
в Python версии 3.9 и старше.
Визуализация
Визуализируйте процесс перевода времени из UTC в локальное, представив его как стрелки часов на карте мирового времени:
Весь мир (🌐): [UTC – 🕛]
Переводим UTC в локальное время так, как бы двигали стрелки часов:
from datetime import datetime, timezone, timedelta
def to_local_time(utc_datetime):
offset = datetime.now(timezone.utc).astimezone().utcoffset()
return utc_datetime + offset
Таким образом, мы получаем корректное локальное время:
🌐 UTC – 🕛 ➡️ Локальное время – 🕑
# Часы показывают ваше местное время!
Математика временных зон в действии!
Глубокое погружение в управление временными зонами
Работа с временными зонами порой напоминает глубокое погружение в океан.
Определение системной временной зоны с помощью tzlocal
Модуль tzlocal
поможет определить системную временную зону. Установите его с помощью команды:
pip install tzlocal # Добавляет поддержку локальной временной зоны
from datetime import datetime
from tzlocal import get_localzone # Определяем системную временную зону
local_tz = get_localzone()
utc_dt = datetime.utcnow()
local_dt = utc_dt.replace(tzinfo=timezone.utc).astimezone(local_tz) # Конвертируем с использованием системной зоны
print(f"Локальное время с использованием tzlocal: {local_dt}") # Вот и готово!
Для пользователей Windows: установите 'tzdata'
Если вы работаете в операционной системе Windows, не забудьте установить пакет 'tzdata':
pip install tzdata # Необходим для корректной работы с 'zoneinfo' на Windows
Преобразование для Python версий от 3.3 до 3.8
В версиях Python между 3.3 и 3.8 время из UTC может быть также преобразовано без использования дополнительных библиотек:
from datetime import datetime, timezone
utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc)
local_dt = utc_dt.astimezone() # Встроенная функциональность для преобразования
print(f"Локальное время с использованием astimezone: {local_dt}") # И готово!
Опасности, которые могут подстерегать на вашем пути
Как и в любом путешествии, есть свои риски и опасности.
Нормализация до преобразования
Предварительно назначьте временную зону 'наивным' объектам datetime:
from datetime import datetime, timezone
naive_utc_dt = datetime.utcnow()
utc_dt = naive_utc_dt.replace(tzinfo=timezone.utc) # Присваиваем временную зону
print(f"Нормализованное время с учетом временной зоны: {utc_dt}") # Таким образом, у нас есть нормализованное время
Точность вычислений
При конвертации меток времени необходимо учитывать микросекунды:
import time
timestamp = time.time()
local_dt = datetime.fromtimestamp(timestamp) # Конвертируем целочисленную временную метку
print(f"Локальное время, полученное из целочисленной временной метки: {local_dt}") # Точность подсчета времени сохранена!
Изменения в правилах перехода на летнее время и изменения смещения UTC
Будьте готовы к тому, что правила перехода на летнее время и значения смещения UTC могут переодически обновляться.
Полезные ресурсы
- Официальная документация Python 3.12.2 по модулю datetime — полное руководство по работе со временем в Python.
- PEP 495 – Разрешение неоднозначности локального времени — подробное описание работы с временными зонами в Python.
- PyMOTW 3 по модулю datetime — справочник по модулю datetime.
- Стандарт ISO 8601 на странице Википедии — стандарты обозначения времени по ISO.
- Документация dateutil 2.8.2 — функциональность dateutil, которая дополняет модуль datetime.