Одной из распространенных проблем, с которыми сталкиваются разработчики, является необходимость сравнения объектов datetime в Python. В частности, проблемы возникают, когда требуется сравнить объект datetime, не осведомленный о временной зоне (так называемый «наивный» объект datetime), и объект datetime, осведомленный о временной зоне.
Предположим, есть два объекта datetime. Один из них создан с указанием временной зоны, а второй — без нее.
import datetime import pytz unaware = datetime.datetime(2011,8,15,8,15,12,0) aware = datetime.datetime(2011,8,15,8,15,12,0,pytz.UTC)
При попытке сравнения этих двух объектов возникнет ошибка, поскольку Python не позволяет сравнивать «наивные» и «осведомленные» объекты datetime.
aware == unaware
Один из способов решения этой проблемы — сделать «наивный» объект datetime «осведомленным». Однако простое присвоение временной зоны с помощью метода replace не решает проблему, так как объект остается «наивным».
unaware.replace(tzinfo=pytz.UTC)
Данная проблема может быть решена с помощью библиотеки pytz, которая предоставляет функцию localize
, позволяющую сделать «наивный» объект datetime «осведомленным».
aware_now = pytz.UTC.localize(unaware)
Теперь объекты datetime можно сравнивать без возникновения ошибки.
aware == aware_now
Это наиболее надежный способ сделать объект datetime «осведомленным» о временной зоне, и он может быть легко адаптирован для работы с любой временной зоной, поддерживаемой библиотекой pytz.
Добавить комментарий