什么时候
datetime.now(pytz_timezone)失败?
据我所知,在任何情况下它都不会失败。
在参数中传递的实例上
datetime.now调用
fromutc函数
tzinfo。从UTC到当地时间的所有转换都是明确的,因此没有失败的机会。
同样,原始代码甚至无法正常工作。
d = est.normalize(EST)
这似乎将字符串作为唯一参数传递给
normalize,该参数应采用
datetime。这给出:
AttributeError: 'str' object has no attribute 'tzinfo'
我相信他们打算写:
d = est.normalize(d.astimezone(est))
就是说,我认为他们代码的冗长性不会增加太多价值。如您所述,只需一步就可以轻松完成此操作:
d = datetime.now(est)
查看的cpython源代码
datetime.now,我可以看到,当
tzinfo提供一个对象时,它将调用该
fromutc对象上的方法。
if (self != NULL && tz != Py_None) { PyObject *temp = self; self = _PyObject_CallMethodId(tz, &PyId_fromutc, "O", self); Py_DECREF(temp);}然后,在源pytz,我看到
fromutc方法被实现不同取决于该区域是否是
pytz.UTC或的一个实例
StaticTzInfo,或
DstTzInfo。在所有三种情况下,从输入UTC值到目标时区的转换都是明确的。这是
DstTzInfo实现,这是三个中的更复杂的:
def fromutc(self, dt): '''See datetime.tzinfo.fromutc''' if (dt.tzinfo is not None and getattr(dt.tzinfo, '_tzinfos', None) is not self._tzinfos): raise ValueError('fromutc: dt.tzinfo is not self') dt = dt.replace(tzinfo=None) idx = max(0, bisect_right(self._utc_transition_times, dt) - 1) inf = self._transition_info[idx] return (dt + inf[0]).replace(tzinfo=self._tzinfos[inf])这似乎是找到
_utc_transition_times时区的过渡,然后将其应用于return
datetime。在这个方向上没有歧义,因此结果将是相同的。
另外值得一提的,在该
datetime文档它说,
datetime.now等效于调用:
tz.fromutc(datetime.utcnow().replace(tzinfo=tz))
鉴于
fromutc我之前显示的pytz的来源,我不确定这与只是有什么不同:
tz.fromutc(datetime.utcnow())
但在任何情况下,我不认为
localize和
normalize是必要的。



