我想存储具有本地化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)
答案 0 :(得分:74)
如何确定是否需要本地化?
日期时间对象d
知道iff:
d.tzinfo is not None and d.tzinfo.utcoffset(d) is not None
d
是天真的iff:
d.tzinfo is None or d.tzinfo.utcoffset(d) is None
虽然如果d
是表示UTC时区的时间的日期时间对象,那么您可以在两种情况下使用:
self.date = d.replace(tzinfo=pytz.utc)
无论d
是时区感知还是天真,都可以。
注意:don't use datetime.replace()
method with a timezone with a non-fixed utc offset(可以将它与UTC时区一起使用,否则你应该使用tz.localize()
方法。)
答案 1 :(得分:22)
如果要检查日期时间对象'd'是否已本地化,请检查d.tzinfo,如果它是None,则不进行本地化。
答案 2 :(得分:2)
这是一个更完整的函数,用于将时间戳obj转换或强制转换为utc。如果它到达异常,则表示时间戳未本地化。由于在代码中始终以UTC工作是一种好习惯,因此该函数在持久性的入门级非常有用。
i
J.F.Sebastian在答案中的'try catch'中的少量添加是额外的捕获条件,没有它,并非所有天真的情况都会被该函数捕获。
答案 3 :(得分:1)
这是一个包含最佳答案的功能。
def tz_aware(dt):
return dt.tzinfo is not None and dt.tzinfo.utcoffset(dt) is not None