85

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

缺少 if 条件的代码:

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

4 回答 4

148

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

来自datetime文档

  • 一个 datetime 对象d知道 iff:

    d.tzinfo is not None and d.tzinfo.utcoffset(d) is not None
    
  • d天真当当:

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

虽然 ifd是一个代表 UTC 时区时间的 datetime 对象,但您可以在这两种情况下使用:

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

无论d是时区感知还是幼稚,它都有效。

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

于 2014-12-22T05:14:58.380 回答
26

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

于 2011-04-27T09:51:43.567 回答
12

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

def tz_aware(dt):
    return dt.tzinfo is not None and dt.tzinfo.utcoffset(dt) is not None
于 2018-06-06T00:50:04.717 回答
3

这是一个更完整的函数,用于将时间戳 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

JF Sebastian 回答中的“try catch”中的一个小补充是附加的 catch 条件,没有它,函数不会捕获所有幼稚的情况。

于 2015-12-31T07:26:21.100 回答