В Python работа с объектами date
и datetime
часто возникает в контексте сравнения временных меток, что является ключевым аспектом обработки данных во время и датах. Операторы сравнения, такие как <
, >
, <=
, >=
, ==
и !=
, позволяют эффективно определять относительное положение двух временных объектов.
Объекты date
представляют собой только дату (год, месяц, день), тогда как datetime
включает в себя и время (часы, минуты, секунды и доли секунды). При сравнении объекта date
с объектом datetime
, Python автоматически приводит date
к полному datetime
, добавляя временную составляющую с нулевыми значениями. Это означает, что date
будет эквивалентен datetime
с временем, установленным на полночь.
Ранее в курсе мы узнали, что два объекта date
можно сравнить между собой при помощи операторов сравнения (<
, <=
, ==
, !=
, >=
, >
). Даты сравниваются по хронологии, меньше та дата, которая наступила раньше.
from datetime import date
date1 = date(2024, 9, 7)
date2 = date(2024, 9, 6)
date3 = date(2024, 9, 8)
print(date1 == date2)
# False
print(date1 < date3)
# True
print(date2 > date3)
# False
print(date2 >= date(2024, 9, 6)) # True
Далее мы узнали, что два объекта datetime
также можно сравнить между собой при помощи тех же операторов. Сравнение происходит на основании их даты и времени опять же хронологическом порядке
from datetime import datetime
datetime1 = datetime(2024, 9, 7, 10, 0)
datetime2 = datetime(2024, 9, 7, 12, 0)
datetime3 = datetime(2024, 9, 7, 10, 0)
print(datetime1 == datetime2)
print(datetime1 < datetime2)
print(datetime1 >= datetime3)
print(datetime1 <= datetime(2024, 9, 7, 9, 59))
print(datetime1 != datetime(2024, 9, 7, 10, 0))
print(datetime1 == datetime(2024, 9, 7, 10, 0))
Теперь давайте научимся сравнивать между собой date
и datetime
, изначально эти два объекта нельзя сравнивать между собой при помощи операторов <
, <=
, >=
, >
, это приведет к исключению TypeError
.
При сравнении на равенство объектов date
и datetime
вы всегда будете получать False
. Это происходит из-за различия в типах данных и структуре объектов. Объект date
представляет только дату (год, месяц и день), тогда как объект datetime
представляет и дату, и время (год, месяц, день, час, минуты и секунды). Поэтому python считает их разными объектами и возвращает False
при сравнении.
Правило очень простое - сравнивайте всегда одинаковые объекты. А чтобы тип объектов совпал используйте конвертацию данных. Проще всего объект datetime
преобразовать в объект date
при помощи одноименного метода. И тогда вы можете спокойно использовать любой из операторов сравнения:
from datetime import date, datetime
d = date(2024, 9, 7)
dt = datetime(2024, 9, 7, 10, 0)
print(d == dt.date())
# True
print(d > dt.date())
# False
print(d < dt.date())
# False
print(d != dt.date())
# False
print(d == datetime(2023, 9, 7).date())
# True
print(d >= datetime(2023, 9, 7).date())
# True
Когда вы преобразовываете объект datetime
в date
информация о часах минутах и секундах исчезает, остается только дни, месяцы и года.