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

3 Solutions collect form web for “Как проверить, локализован ли объект datetime с помощью pytz?”

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

Из документов datetime :

  • объект datetime d знает iff:

     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 – объект datetime, представляющий время в часовом поясе UTC, тогда вы можете использовать в обоих случаях:

 self.date = d.replace(tzinfo=pytz.utc) 

Он работает независимо d является ли d часовой поясным или наивным.

Примечание. Не используйте метод datetime.replace() с часовым поясом с нефиксированным смещением utc (нормально использовать его с tz.localize() UTC, но в противном случае вы должны использовать tz.localize() ).

Если вы хотите поддерживать произвольные временные интервалы для известных объектов datetime, то для представления времени в часовом поясе UTC в приложении требуется только наивные объекты datetime, тогда вы можете использовать метод pytz.utc для преобразования d в pytz.utc пояс pytz.utc :

 try: self.date = d.astimezone(pytz.utc) # aware object can be in any timezone except ValueError: # naive self.date = d.replace(tzinfo=pytz.utc) # d must be in UTC 

Примечание: вам не нужно вызывать tz.normalize() после d.astimezone() здесь, потому что часовой пояс назначения – это UTC.

Он работает, даже если d.tzinfo использует не-pytz timezones.

если вы хотите проверить, локалирован ли объект d-dtime «d», проверьте d.tzinfo, если он отсутствует, никакой локализации.

Ниже приведена более полная функция для преобразования или принуждения временной метки 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» в ответе Дж. Ф. Себастьяна – дополнительное условие улова, без которого не все наивные случаи будут пойманы функцией.

  • Сделать Python ответом на изменения в часовом поясе Windows
  • Python: Как вы конвертируете datetime / timestamp из одного часового пояса в другой часовой пояс?
  • Преобразование временной зоны Datetime с использованием pytz
  • Как получить общее имя для часового пояса pytz, например. EST / EDT для Америки / New_York
  • Означает ли datetime.fromtimestamp (os.path.getctime ()) в Python значение, соответствующее часовому поясу?
  • Почему% z не поддерживается strptime python?
  • Сравнение времени в UTC со временем в восточном времени с использованием Python
  • Даты и время в python: момент vs arrow vs delorean
  • Python - лучший язык программирования в мире.