Какие знаешь типы для работы со временем и датой?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Типы для работы со временем и датой в Python
Работу с датами и временем в Python обеспечивают несколько встроенных типов и библиотек. Рассмотрим их детально.
1. datetime.datetime
datetime — это основной и наиболее полнофункциональный тип для работы с датой и временем. Это комбинация даты и времени суток.
from datetime import datetime
import pytz
# Текущее время (без timezone информации - naive)
now = datetime.now() # 2026-03-22 14:30:45.123456
# Текущее время в UTC (timezone-aware)
from datetime import timezone
now_utc = datetime.now(timezone.utc)
# Конкретная дата и время
dt = datetime(2026, 3, 22, 14, 30, 45)
# Парсинг строки
dt = datetime.fromisoformat('2026-03-22T14:30:45')
dt = datetime.strptime('22.03.2026', '%d.%m.%Y')
# Форматирование
print(dt.strftime('%d.%m.%Y %H:%M:%S')) # 22.03.2026 14:30:45
# Операции
from datetime import timedelta
dt_future = dt + timedelta(days=7, hours=2)
dt_past = dt - timedelta(weeks=1)
# Компоненты
print(dt.year, dt.month, dt.day) # 2026 3 22
print(dt.hour, dt.minute, dt.second) # 14 30 45
# День недели (0=Monday, 6=Sunday)
day_name = dt.strftime('%A') # 'Sunday'
weekday = dt.weekday() # 0-6
# Timestamp
timestamp = dt.timestamp() # Секунды с 1970-01-01
dt_from_ts = datetime.fromtimestamp(timestamp)
2. datetime.date
date — это тип для работы только с датой без времени суток.
from datetime import date
# Текущая дата
today = date.today() # 2026-03-22
# Конкретная дата
d = date(2026, 3, 22)
# Компоненты
print(d.year, d.month, d.day) # 2026 3 22
# День недели
print(d.weekday()) # 0-6
# Парсинг
d = date.fromisoformat('2026-03-22')
# Операции
from datetime import timedelta
d_future = d + timedelta(days=30)
# Разница между датами
diff = d_future - d # timedelta(days=30)
print(diff.days) # 30
3. datetime.time
time — это тип для работы только с временем суток.
from datetime import time
# Конкретное время
t = time(14, 30, 45, 123456) # часы, минуты, секунды, микросекунды
# Компоненты
print(t.hour, t.minute, t.second) # 14 30 45
print(t.microsecond) # 123456
# Форматирование
print(t.strftime('%H:%M:%S')) # 14:30:45
# Парсинг
t = time.fromisoformat('14:30:45')
4. datetime.timedelta
timedelta — это тип для представления разницы между датами/временем.
from datetime import timedelta, datetime
# Создание
td = timedelta(
days=7,
seconds=3600,
microseconds=1000,
milliseconds=100,
minutes=30,
hours=2,
weeks=1
)
# Компоненты
print(td.days) # Дни
print(td.seconds) # Секунды (0-86399)
print(td.microseconds) # Микросекунды (0-999999)
print(td.total_seconds()) # Общее количество секунд
# Арифметика
dt = datetime.now()
dt_future = dt + td
dt_past = dt - td
diff = dt_future - dt_past
# Сравнение
if td > timedelta(days=5):
print("Более пяти дней")
5. pytz для работы с timezone
pytz — это библиотека для правильной работы с временными зонами (timezone-aware datetime).
from datetime import datetime
import pytz
# Текущее время в московской временной зоне
moscow = pytz.timezone('Europe/Moscow')
now_moscow = datetime.now(moscow)
# Конвертация между зонами
utc = pytz.UTC
dt_utc = datetime(2026, 3, 22, 12, 0, 0, tzinfo=utc)
dt_moscow = dt_utc.astimezone(moscow)
print(dt_moscow) # 2026-03-22 15:00:00+03:00
# Список всех доступных timezone
for tz in pytz.all_timezones:
print(tz) # 'Europe/Moscow', 'America/New_York', etc.
# Локализация naive datetime в конкретную zone
naive_dt = datetime(2026, 3, 22, 14, 30, 0)
localised = moscow.localize(naive_dt)
6. dateutil для расширенной функциональности
dateutil — это мощная библиотека с дополнительными возможностями.
from dateutil import parser, rrule
from dateutil.relativedelta import relativedelta
from datetime import datetime
# Умный парсинг строк (понимает разные форматы)
dt = parser.parse('22.03.2026')
dt = parser.parse('March 22, 2026')
dt = parser.parse('2026-03-22')
# Относительная дата (лучше чем timedelta)
dt = datetime(2026, 3, 22)
dt_future = dt + relativedelta(months=2, days=5) # Работает с месяцами
dt_next_year = dt + relativedelta(years=1)
# Генерация серии дат (recurrence rule)
for dt in rrule.rrule(rrule.DAILY, count=10, dtstart=datetime(2026, 3, 22)):
print(dt) # Каждый день, 10 раз
for dt in rrule.rrule(rrule.WEEKLY, count=5, dtstart=datetime(2026, 3, 22)):
print(dt) # Каждую неделю, 5 раз
7. zoneinfo (Python 3.9+)
zoneinfo — встроенная альтернатива pytz (рекомендуется для новых проектов).
from datetime import datetime
from zoneinfo import ZoneInfo
# Текущее время в московской зоне
moscow = ZoneInfo('Europe/Moscow')
now_moscow = datetime.now(moscow)
# Конвертация
dt_utc = datetime(2026, 3, 22, 12, 0, 0, tzinfo=ZoneInfo('UTC'))
dt_moscow = dt_utc.astimezone(moscow)
print(dt_moscow) # 2026-03-22 15:00:00+03:00
8. arrow — высокоуровневая библиотека
arrow — это удобная библиотека с красивым API.
import arrow
# Текущее время
now = arrow.now()
print(now) # 2026-03-22T14:30:45.123456+03:00
# Парсинг
dt = arrow.get('2026-03-22')
dt = arrow.get('2026-03-22T14:30:45')
# Форматирование
print(dt.format('DD.MM.YYYY HH:mm:ss')) # 22.03.2026 14:30:45
# Операции
dt_future = dt.shift(months=2, days=5)
dt_past = dt.shift(years=-1)
# Разница
diff = dt_future - dt
print(diff.total_seconds()) # Секунды
# Временные зоны
dt_moscow = arrow.now('Europe/Moscow')
dt_ny = dt_moscow.to('America/New_York')
Рекомендуемые практики
# НИКОГДА не используй naive datetime для хранения в БД
# ❌ Плохо
from datetime import datetime
now = datetime.now() # Naive, без timezone
# ✅ Хорошо
from datetime import datetime, timezone
now = datetime.now(timezone.utc) # Timezone-aware
# Хрань всё в UTC, конвертируй только для отображения
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
# В БД
dt_utc = datetime.now(timezone.utc)
# При отображении
moscow = ZoneInfo('Europe/Moscow')
dt_moscow = dt_utc.astimezone(moscow)
print(dt_moscow.strftime('%d.%m.%Y %H:%M:%S')) # Москва время
Сравнение библиотек
| Библиотека | Назначение | Рекомендация |
|---|---|---|
| datetime | Встроенный модуль, базовые операции | Всегда используй |
| pytz | Работа с timezone (старый стандарт) | Используй если Python < 3.9 |
| zoneinfo | Встроенная работа с timezone | Python 3.9+ - предпочтителен |
| dateutil | Умный парсинг, relative dates | Для сложных операций |
| arrow | Удобный API | Для быстрого прототипирования |
В production коде предпочитаю комбинацию datetime + zoneinfo + dateutil — это обеспечивает надёжность, гибкость и правильное обращение с timezone.