天真的约会时间有什么意义呢?

时间:2014-06-18 09:11:05

标签: python

来自C#,我学会了在处理日期/时间时始终注意时区。 Python具有适当的时区处理和有用的帮助程序,如datetime.utcnow,这使得日期/时间直接处理。但是,当阅读python文档时,我注意到有一种叫做“天真”的东西。 datetime实例。据我所知,这只是一个没有任何时区的日期时间。

天真日期时间的用例是什么? 没有时区的日期时间是没有用的吗? 为什么datetime.now()不返回当前语言环境中的日期时间(如.NET)?

我确定我错过了至关重要的事情,所以我希望有人可以对此有所了解。

2 个答案:

答案 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;
}

您如何使用天真的日期时间对象取决于您。在我的代码中,我使用天真的数据时间对象:

  1. 好像他们有与他们关联的UTC时区,或
  2. 我根本不关心时区是什么。