Курс по стандартной библиотеке: https://stepik.org/a/259466?utm_source=proproprogs
Последний класс,
который мы рассмотрим в модуле 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