python – 什么时候`datetime.now(pytz_timezone)`失败?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 什么时候`datetime.now(pytz_timezone)`失败?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2647字,纯文字阅读大概需要4分钟。
内容图文
![python – 什么时候`datetime.now(pytz_timezone)`失败?](/upload/InfoBanner/zyjiaocheng/711/894bb88b90744db3b9a85a915060a7c7.jpg)
delorean docs显示这种方式获取给定时区using datetime的当前时间:
from datetime import datetime
from pytz import timezone
EST = "US/Eastern"
UTC = "UTC"
d = datetime.utcnow()
utc = timezone(UTC)
est = timezone(EST)
d = utc.localize(d)
d = est.normalize(EST)
并将其与基于delorian的代码进行比较:
from delorean import Delorean
EST = "US/Eastern"
d = Delorean(timezone=EST)
I believe datetime示例应写为:
from datetime import datetime
import pytz
eastern_timezone = pytz.timezone("US/Eastern")
d = datetime.now(eastern_timezone)
这更简洁.
当最后一个代码示例失败而第一个代码示例继续工作时,是否有任何情况?
from datetime import datetime
import pytz
d = datetime.utcnow()
d = pytz.utc.localize(d)
est = pytz.timezone('US/Eastern')
d = est.normalize(d)
return d
这仍然太冗长了.
解决方法:
When does
datetime.now(pytz_timezone)
fail?
据我所知,没有可能失败的情况. datetime.now在参数中传递的tzinfo实例上调用fromutc函数.从UTC到当地时间的所有转换都是明确的,因此没有失败的机会.
此外,原始代码甚至不起作用.
d = est.normalize(EST)
这似乎传递一个字符串作为规范化的唯一参数,这意味着采用日期时间.这给出了:
AttributeError: 'str' object has no attribute 'tzinfo'
我相信他们打算写:
d = est.normalize(d.astimezone(est))
也就是说,我不认为他们的代码的冗长程度会增加很多价值.正如您所指出的,只需一步即可轻松完成:
d = datetime.now(est)
看一下cpython source code for datetime.now,我可以看到当提供tzinfo对象时,它会调用该对象上的fromutc方法.
if (self != NULL && tz != Py_None) {
/* Convert UTC to tzinfo's zone. */
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过渡,然后将其应用于返回的日期时间.这个方向没有含糊之处,所以结果是等价的.
另外值得注意的是,在the datetime docs它说datetime.now相当于调用:
tz.fromutc(datetime.utcnow().replace(tzinfo=tz))
鉴于我之前展示的pytz中来自fromutc的来源,我不确定这与以下内容有什么不同:
tz.fromutc(datetime.utcnow())
但在任何一种情况下,我都不认为本地化和规范化是必要的.
内容总结
以上是互联网集市为您收集整理的python – 什么时候`datetime.now(pytz_timezone)`失败?全部内容,希望文章能够帮你解决python – 什么时候`datetime.now(pytz_timezone)`失败?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。