python-如何检查datetime对象是否使用pytz本地化?

我想使用本地化UTC时区存储datetime对象。 可以为存储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)
chiborg asked 2019-11-15T15:32:23Z
4个解决方案
85 votes

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

来自tz.localize()文档:

  • 日期时间对象tz.localize()可识别以下内容:

    tz.localize()
  • tz.localize()是天真的iff:

    tz.localize()

虽然如果tz.localize()是一个表示UTC时区中的时间的datetime对象,则在两种情况下都可以使用:

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

无论tz.localize()是否意识到时区还是幼稚,它都可以工作。

注意:请勿将tz.localize()方法与具有非固定utc偏移量的时区一起使用(可以将其与UTC时区一起使用,否则应使用tz.localize()方法)。

jfs answered 2019-11-15T15:33:43Z
23 votes

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

Cédric Julien answered 2019-11-15T15:34:11Z
3 votes

这是一个总结最佳答案的函数。

def tz_aware(dt):
    return dt.tzinfo is not None and dt.tzinfo.utcoffset(dt) is not None
Derek R. answered 2019-11-15T15:34:40Z
2 votes

这是将时间戳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

塞巴斯蒂安·J·F·塞巴斯蒂安(J.F. Sebastian)的答案中的“尝试捕获”中的少量添加是附加捕获条件,如果没有这种条件,该功能就不会捕获所有幼稚的案例。

eiTan LaVi answered 2019-11-15T15:35:13Z
translate from https://stackoverflow.com:/questions/5802108/how-to-check-if-a-datetime-object-is-localized-with-pytz