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

Экземпляры, создаваемые от класса 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. Курс




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