如何检查pytz的datetime对象是否已本地化?

104 投票
4 回答
72469 浏览
提问于 2025-04-16 16:30

我想要存储一个带有本地化UTC时区的日期时间对象。存储这个日期时间对象的方法可以接受一个没有时区信息的日期时间对象(也叫“天真”对象),或者一个已经有时区信息的对象。那么,我该怎么判断是否需要进行时区本地化呢?

下面是缺少判断条件的代码:

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 个回答

14

这里有一个函数,它总结了最好的答案。

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

如果你想检查一个日期时间对象'd'是否已经设置了时区,可以看看它的d.tzinfo。如果这个值是None,那就说明没有设置时区。

179

我怎么知道是否需要本地化?

根据datetime文档

  • 一个日期时间对象d是“有意识的”(aware)当且仅当:

    d.tzinfo is not None and d.tzinfo.utcoffset(d) is not None
    
  • d是“无意识的”(naive)当且仅当:

    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()方法)。

撰写回答