jfs*_*jfs 11 python timezone datetime pytz delorian
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
这仍然太冗长了.
问题仍然存在:您是否需要通过utc进行明确的往返,tz.normalize()或者您可以使用datetime.now(tz)吗?
Mat*_*int 11
什么时候
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时区的转换,然后将其应用于返回datetime.这个方向没有含糊之处,所以结果是等价的.
另外值得一提的,在该datetime文档它说,datetime.now等效于调用:
tz.fromutc(datetime.utcnow().replace(tzinfo=tz))
鉴于fromutc我之前展示的pytz 的来源,我不确定这是否与以下不同:
tz.fromutc(datetime.utcnow())
但在任何情况下,我不认为localize和normalize是必要的.
| 归档时间: | 
 | 
| 查看次数: | 1827 次 | 
| 最近记录: |