Класс 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
(подчеркнуты не упомянутые в уроке):
- данные, хранимые в классе (свойства класса):
min
,max
,resolution
- методы класса:
today
,fromisoformat
,fromtimestamp
,fromordinal
,fromisocalendar
- свойства экземпляра:
day
,month
,year
- методы экземпляра:
replace
,weekday
,isoweekday
,isoformat
,strftime
,ctime
,isocalendar
,timetuple
,toordinal