当前位置: 首页 > 面试题库 >

什么时候datetime.now(pytz_timezone)会失败?

朱建弼
2023-03-14
问题内容

deloreandocs显示了使用以下方法 获取给定时区中的当前时间的
方法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)

我相信这个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

那仍然太冗长。

问题仍然存在:您是否需要通过utc进行显式往返,tz.normalize()或者可以使用它datetime.now(tz)


问题答案:

什么时候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) {
    /* 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时区的过渡,然后将其应用于return
datetime。在这个方向上没有歧义,因此结果将是相同的。

另外值得一提的,在该datetime文档它说,datetime.now等效于调用

tz.fromutc(datetime.utcnow().replace(tzinfo=tz))

鉴于fromutc我之前显示的pytz的来源,我不确定这与只是有什么不同:

tz.fromutc(datetime.utcnow())

但在任何情况下,我不认为localizenormalize是必要的。



 类似资料:
  • 本文向大家介绍什么时候用delegate,什么时候用Notification?相关面试题,主要包含被问及什么时候用delegate,什么时候用Notification?时的应答技巧和注意事项,需要的朋友参考一下 答:delegate针对one-to-one关系,并且reciever可以返回值 给sender,notification 可以针对one-to-one/many/none,recieve

  • 问题内容: 奇怪的是: 似乎或多或少被定义为。通过这种方式很容易产生错误: 一些fname意外地以else块结尾。修复很简单,我们应该改用它,但是从表面上看,这似乎是一种不错的pythonic方式,并且比“正确”的方式更具可读性。 由于字符串是不可变的,所以为什么字符串错误是什么技术细节?什么时候进行身份检查更好,什么时候进行平等检查更好? 问题答案: 据我所知,检查对象身份是否相等。由于没有强制

  • 本文向大家介绍render在什么时候会被触发?相关面试题,主要包含被问及render在什么时候会被触发?时的应答技巧和注意事项,需要的朋友参考一下 在 React 中,只要执行了 setState 方法,就一定会触发 render 函数执行; 组件的 props 改变了,不一定触发 render 函数的执行,除非 props 的值来自于父组件或者祖先组件的 state

  • 问题内容: 我阅读的所有资料都提到了几个案例,并以“其他一些案例”作了总结。在视图/活动中调用onSaveInstanceState方法时,所有情况是什么? 问题答案: 该文档称 在活动被杀死之前将调用此方法,以便将来在将来返回某个时间时可以恢复其状态。

  • 问题内容: 我有一个将客户发送到另一个站点来处理付款的应用程序。客户之外的另一个站点在我们的服务器上调用一个页面,让我们知道付款的状态。被调用页面会检查付款应用程序提供的参数,并检查我们是否知道该交易。然后,它更新数据库以反映状态。这一切都无需与客户进行任何互动即可完成。 我个人选择将此功能实现为JSP,因为将文件拖放到文件系统中比编译和打包文件然后将条目添加到配置文件中要容易得多。 考虑到页面的

  • 问题内容: 我想要的不是Redis和MongoDB之间的比较。我知道他们是不同的。性能和API完全不同。 Redis的速度非常快,但是API的“原子性”非常好。MongoDB将占用更多资源,但是该API非常易于使用,对此我感到非常满意。 它们都很棒,我想在部署中尽可能多地使用Redis,但是很难编写代码。我想在开发中尽可能多地使用MongoDB,但是它需要一台昂贵的机器。 那么您如何看待两者的使用