Курс по стандартной библиотеке: https://stepik.org/a/259466?utm_source=proproprogs
Начиная с этого
занятия, мы с вами будем рассматривать еще один весьма популярный модуль 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. Если
попробовать выполнить присваивание нового значения для какого-либо свойства:
то получим
ошибку. Эти значения можно только читать. Поэтому, как вариант, для изменения
значений времени можно воспользоваться методом 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
которые можно
только читать. Присваивать новые значения недопустимо. Следующая команда
завершится с ошибкой:
Дополнительно с
помощью метода weekday() можно получить порядковый номер дня недели в диапазоне
от 0 до 6 (0 – понедельник):
Или аналогичным
методом 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