Как проверить, локализован ли объект datetime с помощью pytz? - PullRequest
53 голосов
/ 27 апреля 2011

Я хочу сохранить объект datetime с локализованным часовым поясом UTC. Метод, который хранит объект datetime, может быть предоставлен нелокализованному объекту datetime (naive) или объекту, который уже был локализован. Как определить, нужна ли локализация?

Код с отсутствующим условием:

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)

Ответы [ 4 ]

78 голосов
/ 22 декабря 2014

Как определить, нужна ли локализация?

От 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 (его можно использовать с часовым поясом UTC, но в противном случае следует использовать метод tz.localize()).

22 голосов
/ 27 апреля 2011

, если вы хотите проверить, локализован ли объект datetime 'd', проверьте d.tzinfo, если он отсутствует, локализации нет.

2 голосов
/ 06 июня 2018

Вот функция, завершающая верхний ответ.

def tz_aware(dt):
    return dt.tzinfo is not None and dt.tzinfo.utcoffset(dt) is not None
2 голосов
/ 31 декабря 2015

Вот более полная функция для преобразования или приведения временной метки 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' в ответе JF Sebastian - это дополнительное условие перехвата, без которого функция не поймает не все наивные случаи.

...