← Назад к вопросам

Какие знаешь типы для работы со временем и датой?

1.3 Junior🔥 81 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Типы для работы со временем и датой в 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Встроенная работа с timezonePython 3.9+ - предпочтителен
dateutilУмный парсинг, relative datesДля сложных операций
arrowУдобный APIДля быстрого прототипирования

В production коде предпочитаю комбинацию datetime + zoneinfo + dateutil — это обеспечивает надёжность, гибкость и правильное обращение с timezone.

Какие знаешь типы для работы со временем и датой? | PrepBro