Подтвердить что ты не робот

Как проверить, локализован ли объект 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)
4b9b3361

Ответ 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