来自C#,我学会了在处理日期/时间时始终注意时区。 Python具有适当的时区处理和有用的帮助程序,如datetime.utcnow,这使得日期/时间直接处理。但是,当阅读python文档时,我注意到有一种叫做“天真”的东西。 datetime实例。据我所知,这只是一个没有任何时区的日期时间。
天真日期时间的用例是什么? 没有时区的日期时间是没有用的吗? 为什么datetime.now()不返回当前语言环境中的日期时间(如.NET)?
我确定我错过了至关重要的事情,所以我希望有人可以对此有所了解。
答案 0 :(得分:4)
在您不知道或不想指定时区的情况下,天真的日期时间非常有用。
想象一下,例如,您正在解析一个古老的外部程序日志,并且您不知道日期时间在哪个时区 - 您最好的选择是将它们保持原样。在这样的日期时间附加时区可能会导致错误,因为您假装拥有实际上没有的信息。
为什么datetime.now()不返回当前语言环境中的日期时间(如.NET)?
作为国家行政概念的时区经常发生变化。 IIRC,python开发人员选择避免在标准库附带时区数据库,因为安装的标准库的预期寿命(通常)远大于此类数据库中包含的数据的正确性。
相反,您应该下载pytz
包,并经常更新它。然后,您可以使用
from time import tzname
from pytz import timezone
from datetime import datetime
timezone(tzname[0]).localize(datetime.now())
答案 1 :(得分:1)
天真日期时间的用例是什么?
如果datetime对象是天真的,Python不会为指向时区对象的指针分配空间:
/* ---------------------------------------------------------------------------
* Basic object allocation: tp_alloc implementations. These allocate
* Python objects of the right size and type, and do the Python object-
* initialization bit. If there's not enough memory, they return NULL after
* setting MemoryError. All data members remain uninitialized trash.
*
* We abuse the tp_alloc "nitems" argument to communicate whether a tzinfo
* member is needed. This is ugly, imprecise, and possibly insecure.
* tp_basicsize for the time and datetime types is set to the size of the
* struct that has room for the tzinfo member, so subclasses in Python will
* allocate enough space for a tzinfo member whether or not one is actually
* needed. That's the "ugly and imprecise" parts. The "possibly insecure"
* part is that PyType_GenericAlloc() (which subclasses in Python end up
* using) just happens today to effectively ignore the nitems argument
* when tp_itemsize is 0, which it is for these type objects. If that
* changes, perhaps the callers of tp_alloc slots in this file should
* be changed to force a 0 nitems argument unless the type being allocated
* is a base type implemented in this file (so that tp_alloc is time_alloc
* or datetime_alloc below, which know about the nitems abuse).
*/
static PyObject *
time_alloc(PyTypeObject *type, Py_ssize_t aware)
{
PyObject *self;
self = (PyObject *)
PyObject_MALLOC(aware ?
sizeof(PyDateTime_Time) :
sizeof(_PyDateTime_BaseTime));
if (self == NULL)
return (PyObject *)PyErr_NoMemory();
PyObject_INIT(self, type);
return self;
}
您如何使用天真的日期时间对象取决于您。在我的代码中,我使用天真的数据时间对象: