何时`datetime.now(pytz

delorean文档以这种方式显示使用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

这仍然过于冗长。

问题tz.normalize() :你需要通过utc和tz.normalize()进行显式往返,还是可以使用datetime.now(tz)


datetime.now(pytz_timezone)失败?

据我所知,没有可能出现故障的情况。 datetime.now调用传递给参数的tzinfo实例上的fromutc函数。 从UTC到当地时间的所有转换都是明确的,因此不存在失败的机会。

此外,原始代码甚至不起作用。

d = est.normalize(EST)

这看起来会传递一个字符串作为normalize的唯一参数,这意味着需要一个datetime 。 这给出:

AttributeError: 'str' object has no attribute 'tzinfo'

我相信他们打算写:

d = est.normalize(d.astimezone(est))

也就是说,我不认为他们代码的冗长性会增加很多价值。 正如您所指出的那样,只需一步即可轻松完成此操作:

d = datetime.now(est)

查看datetime.now的cpython源代码,我可以看到,当提供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还是StaticTzInfoDstTzInfo的实例。 在所有三种情况下,从输入的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转换,然后将其应用于返回的datetime 。 这个方向没有歧义,所以结果是相同的。

另外值得注意的是,在datetime文档中,它表示datetime.now相当于调用:

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

鉴于我之前展示的fromutc中fromutc的来源,我不确定这与以下任何不同:

tz.fromutc(datetime.utcnow())

但无论如何,我不认为localizenormalize是必要的。

链接地址: http://www.djcxy.com/p/40921.html

上一篇: when does `datetime.now(pytz

下一篇: Inserting datetime into database using pyscopg2 and PostgreSQL