Рубрики
Без рубрики

Сравнение дат в Python – С часовыми поясами и без них

В этом уроке мы рассмотрим, как сравнивать даты в Python с часовыми поясами и без них, используя pytz, с примерами.

Автор оригинала: Geoffery, Joseph.

Вступление

При работе с датами, часто, вы хотели бы знать, если данная дата приходит до или после другой даты. Мы можем получить эти ответы, сравнивая даты.

В этой статье мы узнаем, как использовать модуль Python datetime для создания и сравнения как наивных (без информации о часовом поясе), так и осведомленных (с информацией о часовом поясе) дат.

Для сравнения дат мы будем использовать операторы сравнения в Python: <, >, ==, <=, >=, != .

Примечание: Модуль datetime имеет два метода создания объекта dates – datetime.datetime и datetime.дата . Сравнение можно проводить только с объектами, созданными из одного класса:

datetime.datetime.now() >= datetime.date.today()

Это приведет к TypeError :

TypeError: can't compare datetime.datetime to datetime.date

Сравнение Часового пояса-Наивная дата-время

Давайте начнем с сравнения наивных дат , которые не имеют никакой информации о часовом поясе. Во-первых, мы хотим импортировать модуль datetime :

from datetime import datetime, date

Затем давайте сделаем несколько дат, которые мы можем сравнить:

date1 = date(1995, 3, 20)
date2 = date(2020, 1, 1)
dob_a = datetime(1995, 3, 20)
dob_b = datetime(2020, 1, 1)

Сравнивать эти объекты так же легко, как сравнивать, скажем, целые числа. А дата меньше другой, если ее время предшествует другому.

В нашем случае data 1 считается меньше ( < ), чем date2 , потому что он находится дальше во времени:

print("date1 comes before date2?", date1 < date2)
print("date1 comes after date2?", date1 > date2)
print("date1 is equal to date2?", date1 == date2)

Это приводит к:

date1 comes before date2? True
date1 comes after date2? False
date1 is equal to date2? False

Теперь вы обычно включаете эту логику в некоторые операторы управления потоком:

if  dob_a > dob_b:
    print("person a is older than person b")
else:
    print("person b is older than person a")

Это приводит к:

person b is older than person a

Сравнение времени с учетом Часовых Поясов

Часовые пояса могут немного усложнить ситуацию, хотя, к счастью, мы можем применить ту же самую логику к сравнению. Единственное отличие заключается в том, что мы работаем с aware dates – датами с дополнительной информацией о часовом поясе, в котором они находятся:

from datetime import datetime
import pytz

# Create timezone objects for different parts of the world
tz_ny= pytz.timezone('America/New_York')
tz_lon = pytz.timezone("Europe/London")

# Year, Month, Day, Hour, Minute, Second
datetime = datetime(2010, 4, 20, 23, 30, 0)

# Localize the given date, according to the timezone objects
date_with_timezone_1 = tz_ny.localize(datetime)
date_with_timezone_2 = tz_lon.localize(datetime)

# These are now, effectively no longer the same *date* after being localized
print(date_with_timezone_1) # 2010-04-20 23:30:00-04:00
print(date_with_timezone_2) # 2010-04-20 23:30:00+01:00

print(date_with_timezone_1 == date_with_timezone_2)

Запуск этого кода приводит к:

False

В то время как это утверждение:

print(date_with_timezone_1 > date_with_timezone_2)

Это привело бы к:

True

Теперь этот результат может показаться вам немного странным . Мы сравниваем эти две даты:

2010-04-20 23:30:00-04:00 # date_with_timezone_1
2010-04-20 23:30:00+01:00 # date_with_timezone_2

Интуитивно это выглядит так, что date_with_timezone_2 действительно больше, чем date_with_timezone_1 . Однако давайте посмотрим, как работает функция localize () .

Here, we’ve used the pytz library to make our наивные свидания aware. We’ve constructed a timezone object for New York ( tz_ny ), and a timezone object for London ( tz_lon ).

Затем, чтобы ввести информацию о часовом поясе в наш объект datetime , мы запустили функцию localize() и упаковали результат в date_with_timezone_1 и date_with_timezone_2 .

Мы ввели 11:30 вечера в localize() , что, в свою очередь, создало datetime для 11:30 вечера в Нью-Йорке и 11:30 вечера в Лондоне соответственно. Чтобы добраться с 11:30 вечера в Нью-Йорке до 11:30 вечера в Лондоне, вам придется добавить 4 часа. Прошло больше времени чтобы добраться до Нью-Йорка к 11:30 вечера, чем потребовалось, чтобы добраться до Лондона к 11:30 вечера. Таким образом, дата-время, соответствующее Нью-Йорку в 11:30 вечера, больше, чем дата-время, соответствующее Лондону в 11:30 вечера.

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

Однако стоит отметить, что сравнение осведомленных дат с наивными датами приведет к ошибке:

date_with_timezone = tz_ny.localize(datetime)
print(datetime == date_without_timezone)

Это приведет к следующей ошибке:

TypeError: can't compare offset-naive and offset-aware datetimes

Таким образом, чтобы сравнивать объекты datetime, оба объекта должны быть либо наивными, либо осознанными.

Вывод

В этой статье мы обсудили способы сравнения как часовых поясов, так и часовых поясов в Python, а также рассмотрели возможные подводные камни, с которыми мы можем столкнуться при сравнении дат и возможных обходных путей.

Если у вас есть какие-либо вопросы или предложения, пожалуйста, оставьте их в разделе комментариев ниже.