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

How to check if a datetime object is localized with pytz?

我想存储具有本地化UTC时区的日期时间对象。 存储datetime对象的方法可以被赋予非本地化的日期时间(天真)对象或已经本地化的对象。 如何确定是否需要本地化?

如果条件丢失的代码:

1
2
3
4
5
6
7
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)

How do I determine if localization is needed?

来自datetime docs:

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

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

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

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

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

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

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


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


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

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


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

1
2
3
4
5
6
7
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.Sebastian在答案中的"尝试捕获"中的少量添加是额外的捕获条件,没有它,并不是所有的天真病例都会被该功能捕获。