Модуль datetime для Python: дата и время

Раздел: Стандартная библиотека Python -> Дата и время

Тип datetime в Python: работа с датой и временем

Модуль datetime в Python предоставляет классы для работы с датами, временем, временными интервалами и часовыми поясами. Основной класс datetime.datetime объединяет дату и время. Для большинства задач достаточно использовать этот класс.

Пример создания объекта текущего момента:

import datetime
now = datetime.datetime.now()
print(now)

Python тип время (тип время (datetime) в python)

Результат вывода:

2025-03-25 14:30:15.123456

Для преобразования в строку с нужным форматом применяется метод strftime.

Как получить текущую дату и время?

Используйте datetime.datetime.now() или datetime.datetime.today(). Разница в том, что now() может принимать часовой пояс.

import datetime
current = datetime.datetime.now()
print('Текущая дата и время:', current)

Ошибка: если забыть импортировать модуль, возникнет NameError. Если нужно только сегодняшнее число, можно использовать datetime.date.today().

Как создать объект даты из строки?

Метод strptime разбирает строку в объект datetime по заданному формату.

date_str = '2025-12-31 23:59:59'
dt_obj = datetime.datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S')
print(dt_obj)

Ошибка: несовпадение строки с форматом приводит к исключению ValueError. Проверяйте соответствие кодов форматирования.

Как отформатировать дату в строку?

Используйте strftime с кодами форматирования.

now = datetime.datetime.now()
formatted = now.strftime('%d.%m.%Y %H:%M')
print(formatted)

Результат:

25.03.2025 14:30

Ошибка: буквы в формате могут быть интерпретированы как коды. Если нужно вывести буквальный символ, экранируйте его.

Как вычислить разницу между датами?

Класс timedelta представляет разницу во времени. Вычитание двух datetime даёт timedelta.

d1 = datetime.datetime(2025, 1, 1)
d2 = datetime.datetime(2025, 3, 25)
delta = d2 - d1
print('Прошло дней:', delta.days)

Ошибка: разность timedelta и datetime недопустима. Всегда вычитайте datetime из datetime.

Как работать с часовыми поясами?

Начиная с Python 3.9 рекомендуется модуль zoneinfo (доступен как zoneinfo). Для более старых версий используйте pytz. Пример с использованием встроенного timezone:

from datetime import timezone, timedelta, datetime
msk = timezone(timedelta(hours=3))
dt_utc = datetime.now(timezone.utc)
dt_msk = dt_utc.astimezone(msk)
print(dt_msk)

Ошибка: naive (без часового пояса) и aware (с часовым поясом) объекты нельзя сравнивать напрямую. Приводите к одному типу.

Как получить дату из timestamp?

Метод fromtimestamp преобразует Unix-время в объект datetime.

import time
ts = time.time()
dt = datetime.datetime.fromtimestamp(ts)
print(dt)  # локальное время

Ошибка: для получения UTC используйте datetime.datetime.utcfromtimestamp (устарел) или fromtimestamp(ts, tz=timezone.utc).

Как изменить отдельные компоненты даты?

Метод replace создаёт новый объект с заменёнными полями.

dt = datetime.datetime(2025, 3, 25, 14, 30)
new_dt = dt.replace(year=2026, month=1)
print(new_dt)

Ошибка: replace не изменяет исходный объект, а возвращает новый. Не забывайте присваивать результат.

Расширенные примеры работы с datetime

Пример 1: Определение количества дней в месяце с помощью calendar

Пример
import calendar
import datetime

year = 2025
month = 2
days = calendar.monthrange(year, month)[1]
print(f'В феврале {year} года {days} дней')

# Проверка
first_day = datetime.date(year, month, 1)
last_day = datetime.date(year, month, days)
print('Первый день:', first_day)
print('Последний день:', last_day)
В феврале 2025 года 28 дней
Первый день: 2025-02-01
Последний день: 2025-02-28

Функция monthrange возвращает кортеж (день недели первого числа, количество дней).

Пример 2: Вычисление возраста на основе даты рождения

Пример
from datetime import date

birth = date(1990, 7, 15)
today = date.today()
age = today.year - birth.year - ((today.month, today.day) < (birth.month, birth.day))
print('Возраст:', age)

# Альтернатива с использованием timedelta
age_timedelta = (today - birth).days // 365
print('Приблизительный возраст (дни/365):', age_timedelta)
Возраст: 34
Приблизительный возраст (дни/365): 34

Точный учёт дня рождения (если день рождения ещё не наступил в этом году, вычитаем 1).

Пример 3: Работа с часовыми поясами через zoneinfo (Python 3.9+)

Пример
from datetime import datetime, timedelta
from zoneinfo import ZoneInfo

# Текущее время в UTC
dt_utc = datetime.now(ZoneInfo('UTC'))
print('UTC:', dt_utc)

# Перевод в Москву
moskow = ZoneInfo('Europe/Moscow')
dt_moscow = dt_utc.astimezone(moskow)
print('Москва:', dt_moscow)

# Перевод в Нью-Йорк
ny = ZoneInfo('America/New_York')
dt_ny = dt_utc.astimezone(ny)
print('Нью-Йорк:', dt_ny)

# Разница между часовыми поясами
diff = dt_moscow - dt_ny
print('Разница между Москвой и Нью-Йорком:', diff)
UTC: 2025-03-25 12:00:00+00:00
Москва: 2025-03-25 15:00:00+03:00
Нью-Йорк: 2025-03-25 08:00:00-04:00
Разница между Москвой и Нью-Йорком: 7:00:00

Модуль zoneinfo использует базу данных IANA. Для старых версий Python устанавливайте pytz.

Пример 4: Парсинг ISO-строки с часовым поясом

Пример
from datetime import datetime

# ISO строка с часовым поясом
iso_str = '2025-03-25T14:30:00+03:00'
dt = datetime.fromisoformat(iso_str)
print('Объект datetime:', dt)
print('Часовой пояс:', dt.tzinfo)

# Строка без часового пояса
iso_naive = '2025-03-25T14:30:00'
dt_naive = datetime.fromisoformat(iso_naive)
print('Naive datetime:', dt_naive)
Объект datetime: 2025-03-25 14:30:00+03:00
Часовой пояс: +03:00
Naive datetime: 2025-03-25 14:30:00

Метод fromisoformat доступен начиная с Python 3.7 и корректно обрабатывает часовые пояса.

Пример 5: Работа с Unix timestamp

Пример
import datetime
import time

# Текущий timestamp
ts = time.time()
print('Unix timestamp:', ts)

# Из timestamp в datetime UTC
dt_utc = datetime.datetime.fromtimestamp(ts, tz=datetime.timezone.utc)
print('UTC datetime:', dt_utc)

# Из timestamp в локальное datetime
dt_local = datetime.datetime.fromtimestamp(ts)
print('Локальное datetime:', dt_local)

# Обратное преобразование
ts_back = dt_local.timestamp()
print('Обратно в timestamp:', ts_back)
Unix timestamp: 1742905800.123456
UTC datetime: 2025-03-25 12:00:00+00:00
Локальное datetime: 2025-03-25 15:00:00
Обратно в timestamp: 1742905800.123456

Для точности используйте timestamp() только для aware объектов, иначе Python может интерпретировать как локальное время.

Тип время (datetime) в Python - comments

En
Python тип время (python)