Класс datetime модуля datetime

Курс по стандартной библиотеке: https://stepik.org/a/259466?utm_source=proproprogs

Смотреть материал на YouTube | RuTube

Последний класс, который мы рассмотрим в модуле datetime, объединяет в себе как дату (год, месяц, день), так и время (часы, минуты, секунды, микросекунды). Дополнительно этот класс может содержать информацию о временной зоне (tzinfo), однако такая возможность доступна только через сторонние модули.

Существует несколько способов создания объектов класса datetime. Самый очевидный – это непосредственно конструирование экземпляра класса, учитывая следующий синтаксис:

datetime(year, month, day[, hour, minute, second, microsecond])

То есть, мы обязательно должны указывать год, месяц, день, а часы, минуты и все остальное – по желанию. Например:

import datetime
 
now = datetime.datetime(2025, 8, 15)
full_date = datetime.datetime(2025, 8, 15, 12, 10, 45, 32)
date_time = datetime.datetime(2025, 8, 15, second=20)

Если время не указано, то оно заполняется нулевыми значениями. Аналогично, если неполное время прописано (как для date_time), то остальные значения равны нулю.

Однако не всегда бывает удобно явно прописывать дату и время, поэтому класс datetime содержит следующие полезные методы:

  • datetime.now() – получает текущее местное время;
  • datetime.utcnow() – возвращает текущее время по универсальному мировому времени (UTC);
  • datetime.today() – аналогично now(), но без временной зоны.

Например:

now = datetime.datetime.now()
utcnow = datetime.datetime.utcnow()
today = datetime.datetime.today()

Кроме того, объекты класса datetime можно конструировать на основе еще таких методов:

  • datetime.fromordinal(n) – по числу дней (отсчет с 1 января 1-го года);
  • datetime.fromtimestamp(n) – по числу секунд (отсчет с 1 января 1970 года) с учетом временной зоны;
  • datetime.utcfromtimestamp(n) – по числу секунд (отсчет с 1 января 1970 года) без учета временной зоны.

Например:

datetime.datetime.fromordinal(1) # datetime(1, 1, 1, 0, 0)
datetime.datetime.fromordinal(1000)  #datetime(3, 9, 27, 0, 0)
datetime.datetime.fromtimestamp(0)  # datetime(1970, 1, 1, 4, 0)
datetime.datetime.utcfromtimestamp(0)  # datetime(1970, 1, 1, 0, 0)
datetime.datetime.fromtimestamp(200)  # datetime(1970, 1, 1, 4, 3, 20)

Наконец, объекты datetime можно конструировать из уже существующих объектов date и time, используя метод combine():

dt = datetime.date.today()
tm = datetime.time(10, 23, 44)
d = datetime.datetime.combine(dt, tm)

Как видите, способов создания объектов класса datetime множество и программист всегда может выбрать самый подходящий.

Объекты класса datetime содержат следующие свойства (доступные только для чтения):

  • year – год;
  • month – месяц;
  • day – день;
  • hour – часы;
  • minute – минуты;
  • second – секунды;
  • microsecond – микросекунды.

А также ранее рассмотренные методы классов date и time:

  • strftime() – формирование строкового представления даты-времени;
  • ctime() – возвращает строковое представление даты-времени;
  • timetuple() – возвращает структуру struct_time;
  • replace() – создает новый объект с измененными датой/временем;
  • isoformat() – возвращает дату-время в ISO-формате;
  • weekday() – возвращает порядковый номер дня недели (от 0 до 6);
  • isoweekday() – возвращает порядковый номер дня недели (от 1 до 7);
  • toordinal() – возвращает общее число дней от 1 января 1-го года.

Как использовать все эти свойства и методы вы уже знаете из предыдущих занятий, поэтому сразу перейдем к арифметике дат с объектами класса datetime.

Арифметика дат

В целом, здесь все тоже по аналогии с ранее рассмотренной арифметикой объектов класса date. Для примера, пусть имеются два следующих экземпляра класса datetime:

now = datetime.datetime.now()
someday = datetime.datetime(2025, 7, 5)

Интервал между этими двумя метками времени можно вычислить следующим образом:

dt = now - someday
print(dt)  # 5 days, 10:23:21.151480

В результате получим объект dt типа timedelta – класса, который описывает временные интервалы. Причем вычислять разницу можно только между однотипными объектами. Например, если создать объект другого класса date:

now_date = datetime.date.today()

и записать команду:

dt = now - now_date  # TypeError

то получим ошибку TypeError. А вот операции с объектами класса timedelta вполне допустимы, например:

two_days = timedelta(days=2)
four_weeks = timedelta(weeks=4)
 
someday - two_days  # datetime(2025, 7, 3, 0, 0)
someday + four_weeks  # datetime(2025, 8, 2, 0, 0)

Причем с объектами timedelta можно выполнять только операции сложения и вычитания временных диапазонов. Умножение, деление и прочие арифметические операции здесь недопустимы.

Таким образом, объекты класса datetime ведут себя подобно объектам класса date, только дополнительно содержат информацию о времени.

Курс по стандартной библиотеке: https://stepik.org/a/259466?utm_source=proproprogs

Видео по теме