Класс date модуля datetime. Работа с датами в Python

  1. Создание экземпляров date и формат их вывода по-умолчанию.
  2. Обращение к свойствам экземпляра date. Определение дня недели даты.
  3. Как "изменить" дату? Метод replace.
  4. Как получить сегодняшнюю дату? Метод today.
  5. Как получить дату из строки? Метод fromisoformat.
  6. Вывод дат в различных форматах: метод strftime.
  7. Операции с экземплярами date:
    1. сравнение дат,
    2. вычисление количества дней между датами,
    3. определение даты, отстоящей от исходной на заданное количество дней.

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

Чтобы создать объект даты непосредственно от date, надо в конструктор класса передать три целочисленных значения – год, месяц и день.

from datetime import date
 
d1 = date(2023, 3, 18)
d2 = date(day=10, month=9, year=2022)
 
print(type(d1))
 
print(d1)
print(d2)

Результат:

<class 'datetime.date'>
2023-03-18
2022-09-10

Тот факт, что даты были выведены в формате YYYY-MM-YY (стандарт ISO 8601), связан с тем, что при вызове функции print языка Python сначала вызывается метод __str__ объекта, который передается в print. В случае date метод __str__ возвращает год, месяц, день экземпляра-даты в виде соответствующей строки.

Если же мы в самом интерпретаторе обратимся к объекту или передадим его в функцию repr, то увидим строку, отражающую его представление как объекта класса date.

У экземпляров date есть свойства year, month, day. Значениями года могут быть целые числа от 1 до 9999. Эти минимально и максимально допустимые года содержатся в константах MAXYEAR и MINYEAR модуля datetime. Месяц и день создаваемой даты также должны находиться в допустимых диапазонах.

С помощью методов weekday и isoweekday можно узнать номер дня недели даты. Разница между методами заключается в старте нумерации с 0 или 1.

from datetime import date
 
d = date(2023, 3, 15)
if d.isoweekday() == 7:
    print("Выходной")
else:
    print("Рабочий")

Объекты date являются неизменяемыми. Другими словами, мы не можем перезаписать значение свойства, например, перейти к следующему дню. Зато у экземпляров есть метод replace, возвращающий новую дату, в которой заменены значения свойств, если соответствующие аргументы передаются, или возвращается другой экземпляр с теми же данными.

from datetime import date
 
d = date(2023, 5, 6)
print(d.replace(year=2024))  # 2024-05-06
 
# дата не изменилась
print(d)  # 2023-05-06
 
# переменная связывается с новым объектом date
d = d.replace(day=d.day+1)
print(d)  # 2023-05-07

Для получения сегодняшней даты используется классовый метод today.

Метод fromisoformat класса возвращает экземпляр даты, соответствующий переданной в него строке, представляющей собой дату в ISO-формате. Метод удобно использовать, когда дата, например, вводится пользователем или считывается из файла.

from datetime import date
 
s = input('Введите дату в формате YYYY-MM-DD: ')
 
try:
    d = date.fromisoformat(s)
    print('Год:', d.year)
    print('Месяц:', d.month)
    print('День:', d.day)
    print(f'Это {d.isoweekday()}-й день недели')
except ValueError as e:
    print(e)

Примеры выполнения:

Введите дату в формате YYYY-MM-DD: 2024, 1, 1
Invalid isoformat string: '2024, 1, 1'
Введите дату в формате YYYY-MM-DD: 2023-06-28
Год: 2023
Месяц: 6
День: 28
Это 3-й день недели
Введите дату в формате YYYY-MM-DD: 2021-09-32
day is out of range for month

Если недостаточно вывода в формате ISO, который обеспечивает __str__ и заменяющий его метод isoformat, то более широкие возможности дает strftime. Здесь форматом вывода управляют с помощью определенных кодов.

from datetime import date
 
d = date(2023, 5, 7)
 
print('1:', d)
print('2:', d.isoformat())
 
print('3:', d.strftime("%d-%m-%y"))
print('4:', d.strftime("%d %B %Y, %A"))
1: 2023-05-07
2: 2023-05-07
3: 07-05-23
4: 07 May 2023, Sunday

Все коды форматов можно посмотреть в официальной документации.

Даты можно сравнивать между собой и вычислять количество дней между ними.

from datetime import date
 
deadline = date(2023, 5, 31)
today = date.today()
 
if today < deadline:
    diff = deadline - today
    print("Осталось дней:", diff.days)
elif today > deadline:
    diff = today - deadline
    print("Вы задержали на дней:", diff.days)
else:
    print("Сегодня крайний срок")

Когда из одной даты вычитается другая, возвращается экземпляр типа timedelta, свойство days которого содержит количество дней. Подробно этот класс рассмотрим позже.

В свою очередь к дате можно как прибавлять объект timedelta, так и вычитать. Результатом таких операций является другой экземпляр даты, отстоящий от даты-операнда в будущее или прошлое на количество дней таймдельты.

from datetime import date, timedelta
 
date1 = date.fromisoformat(input("Введите дату YYYY-MM-DD: "))
days = timedelta(int(input("Сколько дней от нее: ")))
 
print("Ваша дата:", date1 + days)
Введите дату YYYY-MM-DD: 2023-08-09
Сколько дней от нее: 2
Ваша дата: 2023-08-11
Введите дату YYYY-MM-DD: 2024-05-10
Сколько дней от нее: -18
Ваша дата: 2024-04-22

Атрибуты класса date (подчеркнуты не упомянутые в уроке):

Даты и время в Python. Курс




Все разделы сайта