Классы 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

Всегда обрабатывайте исключения, если формат может отличаться.

Модуль datetime - comments

En
Python datetime date (python)