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

chi*_*org 57 python timezone datetime 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)
Run Code Online (Sandbox Code Playgroud)

jfs*_*jfs 91

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

来自datetimedocs:

虽然if d是一个表示UTC时区时间的日期时间对象,但您可以在两种情况下使用:

self.date = d.replace(tzinfo=pytz.utc)
Run Code Online (Sandbox Code Playgroud)

它无论d是时区感知还是天真都有效.

注意:不要使用datetime.replace()带有非固定utc偏移的时区的方法(可以将它与UTC时区一起使用,否则你应该使用tz.localize()方法).

  • 由于Python 3.6`astimezone`可以在幼稚实例上调用,因此它假定系统时区。 (2认同)
  • @Mitar:是的。这是不幸的。 (2认同)

Céd*_*ien 23

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

  • 注意:检查`d.tzinfo是否不是'是不够的.此外,[`d.tzinfo.utcoffset(d)`不应该是'无',`d`被称为有意识的日期时间对象](http://stackoverflow.com/a/27596917/4279). (8认同)
  • 这个答案是不正确的,这里是日期时间官方文档中对何时是天真的或知道的定义:“时间或日期时间类型的对象可能是天真的或知道。如果 d.tzinfo 不知道,则日期时间对象 d 是知道的None 和 d.tzinfo.utcoffset(d) 不返回 None。如果 d.tzinfo 是 None,或者如果 d.tzinfo 不是 None 但 d.tzinfo.utcoffset(d) 返回 None,d 是幼稚的。时间对象 t知道是否 t.tzinfo 不是 None 并且 t.tzinfo.utcoffset(None) 不返回 None。否则,t 是幼稚的。” (3认同)

kbl*_*lst 10

这是一个包含最佳答案的函数。

def tz_aware(dt):
    return dt.tzinfo is not None and dt.tzinfo.utcoffset(dt) is not None
Run Code Online (Sandbox Code Playgroud)

  • 其余时间返回“无”? (2认同)