Модуль datetime. Классы time и date

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

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

Начиная с этого занятия, мы с вами будем рассматривать еще один весьма популярный модуль datetime для работы с датой и временем. Предыдущий модуль time больше подходит для оперирования с временными метками. Тогда как datetime предоставляет удобный инструментарий для работы с датами.

Модуль datetime содержит три основных класса:

  • datetime.time – класс для работы со временем (в пределах суток);
  • datetime.date – класс для работы с датой (день, месяц, год);
  • datetime.datetime – класс для работы и с датой и с временем (объединяет возможности двух предыдущих классов).

Изучение начнем с класса datetime.time.

Класс datetime.time

Этот класс предназначен для хранения информации о времени суток без привязки к конкретной дате. И в самом простом варианте создать объект этого класса можно командой:

import datetime
 
my_time = datetime.time(9, 55, 25, 7845)
print(my_time)  # 09:55:25.007845

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

В результате созданный объект my_time содержит следующие полезные свойства (их названия говорят сами за себя):

hour = my_time.hour
minute = my_time.minute
second = my_time.second
microsecond = my_time.microsecond
tzinfo = my_time.tzinfo
fold = my_time.fold

Здесь tzinfo – это используемая временная зона (по умолчанию None); fold – метка летнего времени (по умолчанию 0 – отсутствует).

Дополнительно к этим свойствам сам класс datetime.time содержит следующий набор полезных атрибутов:

datetime.time.max  # datetime.time(23, 59, 59, 999999)
datetime.time.min  # datetime.time(0, 0)
datetime.time.resolution  # datetime.timedelta(microseconds=1)

Которые отражают границы изменения времени и разрешающую способность (в данном случае вплоть до одной микросекунды).

Давайте теперь посмотрим, как можно изменить значение времени в созданном объекте my_time. Если попробовать выполнить присваивание нового значения для какого-либо свойства:

my_time.hour = 10

то получим ошибку. Эти значения можно только читать. Поэтому, как вариант, для изменения значений времени можно воспользоваться методом replace():

t = my_time.replace(0, 0)  # datetime.time(0, 0, 25, 7845)

В результате возвращается новый объект класса datetime.time с измененными данными. При этом исходный объект my_time остается не меняется. Соответственно, чтобы изменения коснулись той же самой переменной, можно воспользоваться конструкцией:

my_time = my_time.replace(minute=10)  # datetime.time(9, 10, 25, 7845)

Здесь мы меняем только значение минут на 10, оставляя другие данные прежними.

По аналогии можно вносить изменения в любые свойства объекта my_time:

my_time = my_time.replace(minute=10, hour=3, second=45)

Если же указать хотя бы одно неверное значение:

my_time = my_time.replace(hour=3, minute=10, second=75)

то получим ошибку.

Еще один полезный метод isoformat() возвращает строковое представление времени в ISO формате:

my_time.isoformat()  # '03:10:45.007845'

Это бывает удобно для быстрого просмотра содержимого того или иного объекта класса datetime.time.

Класс datetime.date

Следующий класс datetime.date служит для представления даты без привязки к конкретному времени суток. Его основное назначение – хранение и обработка информации о конкретном дне (год, месяц, день).

Объекты этого класса можно создавать несколькими способами. В самом простом варианте можно получить уже готовый объект datetime.date для текущей даты с помощью метода today():

today = datetime.date.today()

Либо создать его, указав требуемую дату:

bday = datetime.date(1985, 7, 23)

Эти объекты содержат следующие полезные свойства:

day = today.day
month = today.month
year = today.year

которые можно только читать. Присваивать новые значения недопустимо. Следующая команда завершится с ошибкой:

today.day = 5  # ошибка

Дополнительно с помощью метода weekday() можно получить порядковый номер дня недели в диапазоне от 0 до 6 (0 – понедельник):

wday = today.weekday()

Или аналогичным методом isoweekday(), который возвращает день недели в диапазоне от 1 до 7 (1 – понедельник):

isowday = today.isoweekday()

Помимо этого, сам класс datetime.date имеет следующие атрибуты граничных значений и точности представления дат (до дня):

datetime.date.max  # datetime.date(9999, 12, 31)
datetime.date.min  # datetime.date(1, 1, 1)
datetime.date.resolution   # datetime.timedelta(days=1)

Далее. Для получения числа дней, прошедших с 01.01.01, используется метод toordinal():

today.toordinal()  # 739441

Следующий метод timetuple() возвращает дату в виде структуры struct_time, которая используется многими другими функциями работы с датой и временем:

st = bday.timetuple()
print(st)

В консоли увидим:

time.struct_time(tm_year=1985, tm_mon=7, tm_mday=23, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=204, tm_isdst=-1)

Для быстрого получения строкового представления текущей даты можно воспользоваться методом ctime():

s = today.ctime()  # Wed Jul  9 00:00:00 2025

Обратите внимание, здесь часы установлены в ноль, т.к. объекты класса datetime.date хранят только дату.

Если же нам нужен свой строковый формат даты, то для этого удобно использовать метод strftime(). Он работает по аналогии с функцией strftime(), рассмотренной ранее в модуле time:

s_date = today.strftime("%Y.%m.%d")
print(s_date)  # 2025.07.09

Спецификаторы здесь те же самые, что и в функции strftime():

%Y – полный год (например, 2025).
%y – сокращённый год (например, 25).
%B – название месяца (January, February и т.д.).
%b – сокращенное название месяца (Jan, Feb и т.д.).
%m – номер месяца (1-12).
%d – день месяца (1-31).
%A – название дня недели (Monday, Tuesday и т.д.).
%a – сокращенный день недели (Mon, Tue и т.д.).
%w – день недели в виде числа (0 – воскресенье, 6 – суббота).
%H – часы в 24-часовом формате (0-23).
%I – часы в 12-часовом формате (1-12).
%p – AM/PM индикатор (AM или PM).
%M – минуты (0-59).
%S – секунды (0-61, возможно наличие високосных секунд).
%z – часовой пояс в формате ±HHMM (например, "+0300").
%Z – символическое имя часового пояса (например, "CEST").
%c – локализированное полное представление даты и времени.
%x – локализированное представление даты.
%X – локализированное представление времени.

Наконец, последний часто используемый метод replace() позволяет создавать новые объекты на основе существующего с изменением даты. Например:

myday = bday.replace(year=1980)  # 1980-07-23
myday = bday.replace(month=6, year=1980, day=1)  # 1980-06-01
myday = bday.replace()  # копия объекта bday

Соответственно, если будут указаны неверные значения, то метод replace() сгенерирует ошибку:

bday = bday.replace(month=13)  # ValueError

Это базовые возможности объектов класса datetime.date. На следующем занятии мы продолжим эту тему и увидим, как можно выполнять календарные расчеты с этими объектами.

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

Видео по теме