Как проверить, локализован ли объект datetime с помощью pytz?
Я хочу сохранить объект datetime с локализованным часовым поясом UTC. Метод, который хранит объект datetime, может быть предоставлен нелокализованный объект datetime (наивный) или объект, который уже был локализован. Как определить, нужна ли локализация?
Код с отсутствующим условием:
class MyClass:
def set_date(self, d):
# what do i check here?
# if(d.tzinfo):
self.date = d.astimezone(pytz.utc)
# else:
self.date = pytz.utc.localize(d)
Ответы
Ответ 1
Как определить, нужна ли локализация?
Из datetime
:
-
объект datetime d
знает, если:
d.tzinfo is not None and d.tzinfo.utcoffset(d) is not None
-
d
наивная тогда и только тогда:
d.tzinfo is None or d.tzinfo.utcoffset(d) is None
Хотя, если d
является объектом даты и времени, представляющим время в часовом поясе UTC, вы можете использовать в обоих случаях:
self.date = d.replace(tzinfo=pytz.utc)
Он работает независимо d
является ли он часовым поясом или наивным.
Примечание: не используйте метод datetime.replace()
с часовым поясом с нефиксированным смещением utc (его можно использовать с tz.localize()
UTC, но в противном случае вам следует использовать tz.localize()
).
Ответ 2
если вы хотите проверить, локалирован ли объект d-dtime 'd', проверьте d.tzinfo, если он отсутствует, никакой локализации.
Ответ 3
Здесь приведена более полная функция для преобразования или принуждения временной метки obj к utc. Если он достигает исключения, это означает, что временная метка не локализована. Поскольку хорошая практика всегда работать в UTC в коде, эта функция очень полезна на начальном уровне от настойчивости.
def convert_or_coerce_timestamp_to_utc(timeobj):
out = timeobj
try:
out = timeobj.astimezone(pytz.utc) # aware object can be in any timezone
except (ValueError,TypeError) as exc: # naive
out = timeobj.replace(tzinfo=pytz.utc)
return out
Небольшое дополнение от "try catch" в ответе Дж. Ф. Себастьяна - дополнительное условие улова, без которого не все наивные случаи будут пойманы функцией.
Ответ 4
Вот функция, завершающая верхний ответ.
def tz_aware(dt):
return dt.tzinfo is not None and dt.tzinfo.utcoffset(dt) is not None