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()
方法)。
23 votes
如果要检查日期时间对象'd'是否已本地化,请检查d.tzinfo,如果为None,则不进行本地化。
3 votes
这是一个总结最佳答案的函数。
def tz_aware(dt):
return dt.tzinfo is not None and dt.tzinfo.utcoffset(dt) is not None
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)的答案中的“尝试捕获”中的少量添加是附加捕获条件,如果没有这种条件,该功能就不会捕获所有幼稚的案例。