Классы date и datetime в Python: основные приемы и примеры
Основные возможности модуля datetime
Модуль datetime предоставляет классы для работы с датами и временем. Наиболее эффективное решение для большинства задач – использование класса datetime.datetime в сочетании с datetime.timedelta и datetime.date. Пример получения текущего момента:
from datetime import datetime, date, timedelta
now = datetime.now()
print(now)Python datetime date (модуль datetime)
2025-04-04 12:30:45.123456
Python вывести время (вывод текущего времени в python)
Метод now() возвращает локальную дату и время. Для даты без времени применяется date.today().
today = date.today()
print(today)Python вывести год (вывод текущего года в python)
2025-04-04
Python вывести дату (вывести дату в python)
Как создать дату из строки?
Используйте datetime.strptime. Укажите формат, соответствующий строке.
from datetime import datetime
dt = datetime.strptime('2025-04-04 15:30', '%Y-%m-%d %H:%M')
print(dt)Python разница времени (вычисление разницы между датами и временем в python)
2025-04-04 15:30:00
Python текущая дата и время (получение текущей даты и времени в python)
Ошибка возникает при несовпадении формата. Всегда проверяйте строку на наличие лишних пробелов.
Как получить разницу между двумя датами?
Вычитание двух объектов datetime даёт timedelta.
from datetime import datetime, timedelta
dt1 = datetime(2025, 4, 4, 12, 0)
dt2 = datetime(2025, 4, 5, 14, 30)
delta = dt2 - dt1
print(delta)1 day, 2:30:00
Результат – объект timedelta. С ним можно работать: delta.days, delta.total_seconds().
Как отформатировать дату в строку?
Метод strftime преобразует дату в строку по заданному шаблону.
now = datetime.now()
formatted = now.strftime('%d.%m.%Y %H:%M:%S')
print(formatted)04.04.2025 12:30:45
Обратите внимание: %d – день, %m – месяц, %Y – год с веком.
Как добавить или вычесть дни из даты?
Сложение даты с timedelta изменяет дату.
from datetime import datetime, timedelta
today = datetime.now()
tomorrow = today + timedelta(days=1)
print(tomorrow)Аналогично для вычитания: today - timedelta(weeks=2).
Как получить день недели?
Метод weekday() возвращает номер дня (0 – понедельник, 6 – воскресенье).
today = datetime.now()
print(today.weekday())4
Если нужна читаемая строка, используйте strftime('%A').
Как создать объект только с временем?
Класс datetime.time хранит часы, минуты, секунды.
from datetime import time
t = time(14, 30, 15)
print(t)14:30:15
Можно сравнивать объекты time напрямую.
Как получить дату из timestamp?
Используйте datetime.fromtimestamp().
import time
from datetime import datetime
ts = time.time()
dt = datetime.fromtimestamp(ts)
print(dt)2025-04-04 12:30:45.123456
Метод учитывает локальную временную зону.
Как сравнить две даты?
Объекты datetime поддерживают операторы <, >, ==.
d1 = datetime(2025, 1, 1)
d2 = datetime(2025, 12, 31)
print(d1 < d2)True
Типичные ошибки и их решение:
- ValueError: unconverted data remains – строка содержит символы, не описанные в формате. Убедитесь, что строка и формат точно совпадают. Удалите лишние пробелы.
- TypeError: can't subtract offset-naive and offset-aware datetimes – смешивание datetime без часового пояса и с часовым поясом. Используйте
pytzилиzoneinfoдля приведения к одному типу. - AttributeError: module 'datetime' has no attribute 'date' – импортирован только модуль
datetime, но не класс. Правильно:from datetime import date. - Неожиданный результат при сложении timedelta с date – класс
dateне поддерживает сложение сtimedeltaнапрямую? На самом деле поддерживает, но результат –date. Если нуженdatetime, сначала преобразуйте.
Продвинутые примеры работы с datetime
Работа с часовыми поясами через zoneinfo
Начиная с Python 3.9, модуль zoneinfo позволяет работать с IANA-таймзонами.
from datetime import datetime
from zoneinfo import ZoneInfo
# Текущее время в UTC
utc_now = datetime.now(ZoneInfo('UTC'))
print(utc_now)
# Перевод в Московское время
msk = utc_now.astimezone(ZoneInfo('Europe/Moscow'))
print(msk)2025-04-04 12:30:45.123456+00:00 2025-04-04 15:30:45.123456+03:00
Все объекты становятся offset-aware. Это исключает ошибки смешивания naive и aware.
Расчёт возраста человека по дате рождения
Используем разность дат с учётом дня рождения в текущем году.
from datetime import datetime, date
def calc_age(birth_str):
birth = datetime.strptime(birth_str, '%Y-%m-%d').date()
today = date.today()
age = today.year - birth.year
# Если день рождения ещё не наступил в этом году
if (today.month, today.day) < (birth.month, birth.day):
age -= 1
return age
print(calc_age('2000-04-04'))25
Обратите внимание на сравнение кортежей (месяц, день).
Парсинг дат в нестандартных форматах
Например, дата вида '04.04.2025 3:30 PM'. Требуется правильно задать формат с учётом AM/PM.
from datetime import datetime
dt = datetime.strptime('04.04.2025 3:30 PM', '%d.%m.%Y %I:%M %p')
print(dt)2025-04-04 15:30:00
Ключевые символы: %I – 12-часовой формат, %p – AM/PM.
Генерация последовательности дат с помощью timedelta
Создание списка последних 7 дней.
from datetime import datetime, timedelta
today = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
last_week = [today - timedelta(days=i) for i in range(7)]
for d in last_week:
print(d.strftime('%Y-%m-%d'))2025-04-04 2025-04-03 2025-04-02 2025-04-01 2025-03-31 2025-03-30 2025-03-29
Метод replace обнуляет время, чтобы получить полночь.
Количество секунд между двумя моментами
Используйте total_seconds() у timedelta.
from datetime import datetime, timedelta
start = datetime(2025, 4, 4, 12, 0, 0)
end = datetime(2025, 4, 4, 12, 10, 30)
delta = end - start
print(f'Прошло {delta.total_seconds():.0f} секунд')Прошло 630 секунд
Аналогично можно вычислить разницу в минутах, разделив на 60.
Работа с датами в CSV-файлах
При чтении CSV часто нужно парсить столбец с датами. Пример с использованием модуля csv.
import csv
from datetime import datetime
data = """name,date
Alice,2025-04-04
Bob,2025-04-05"""
reader = csv.DictReader(data.splitlines())
for row in reader:
dt = datetime.strptime(row['date'], '%Y-%m-%d')
print(f"{row['name']}: {dt.strftime('%d.%m.%Y')}")Alice: 04.04.2025 Bob: 05.04.2025
Всегда обрабатывайте исключения, если формат может отличаться.