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?
来自
-
日期时间对象
d 知道iff:1d.tzinfo is not None and d.tzinfo.utcoffset(d) is not None -
d 是天真的iff:1d.tzinfo is None or d.tzinfo.utcoffset(d) is None
虽然如果
1 | self.date = d.replace(tzinfo=pytz.utc) |
无论
注意:不要将
如果要检查日期时间对象'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在答案中的"尝试捕获"中的少量添加是额外的捕获条件,没有它,并不是所有的天真病例都会被该功能捕获。