Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг
ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70% Забронировать скидку
07 Июл 2023
2 мин
49

Как сделать объект datetime осведомленным (не наивным)

Одной из распространенных проблем, с которыми сталкиваются разработчики, является необходимость сравнения объектов datetime в Python. В частности, проблемы

Одной из распространенных проблем, с которыми сталкиваются разработчики, является необходимость сравнения объектов 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.

Добавить комментарий

Подарок
Забрать подарок