如何使用pytz检查日期时间对象是否已本地化?

时间:2011-04-27 09:42:59

标签: python datetime timezone pytz

我想存储具有本地化UTC时区的日期时间对象。存储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)

4 个答案:

答案 0 :(得分:74)

  

如何确定是否需要本地化?

来自datetime docs

  • 日期时间对象d知道iff:

    d.tzinfo is not None and d.tzinfo.utcoffset(d) is not None
    
  • d是天真的iff:

    d.tzinfo is None or d.tzinfo.utcoffset(d) is None
    

虽然如果d是表示UTC时区的时间的日期时间对象,那么您可以在两种情况下使用:

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

无论d是时区感知还是天真,都可以。

注意:don't use datetime.replace() method with a timezone with a non-fixed utc offset(可以将它与UTC时区一起使用,否则你应该使用tz.localize()方法。)

答案 1 :(得分:22)

如果要检查日期时间对象'd'是否已本地化,请检查d.tzinfo,如果它是None,则不进行本地化。

答案 2 :(得分:2)

这是一个更完整的函数,用于将时间戳obj转换或强制转换为utc。如果它到达异常,则表示时间戳未本地化。由于在代码中始终以UTC工作是一种好习惯,因此该函数在持久性的入门级非常有用。

i

J.F.Sebastian在答案中的'try catch'中的少量添加是额外的捕获条件,没有它,并非所有天真的情况都会被该函数捕获。

答案 3 :(得分:1)

这是一个包含最佳答案的功能。

def tz_aware(dt):
    return dt.tzinfo is not None and dt.tzinfo.utcoffset(dt) is not None