Модуль datetime для 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 может интерпретировать как локальное время.