From 0af3ade6aa597a8871dbb62c312a8ab62e3cd309 Mon Sep 17 00:00:00 2001 From: Skip Montanaro Date: Thu, 13 Jan 2005 04:12:31 +0000 Subject: [PATCH] Add strptime() constructor to datetime class. Thanks to Josh Spoerri for the changes. --- Doc/lib/libdatetime.tex | 9 ++++++++ Lib/test/test_datetime.py | 9 ++++++++ Misc/ACKS | 1 + Misc/NEWS | 2 ++ Modules/datetimemodule.c | 45 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 66 insertions(+) diff --git a/Doc/lib/libdatetime.tex b/Doc/lib/libdatetime.tex index caf6bbc2679..7f8b8bbcc09 100644 --- a/Doc/lib/libdatetime.tex +++ b/Doc/lib/libdatetime.tex @@ -624,6 +624,15 @@ Other constructors, all class methods: ignored. \end{methoddesc} +\begin{methoddesc}{strptime}{date_string, format} + Return a \class{datetime} corresponding to \var{date_string}, parsed + according to \var{format}. This is equivalent to + \code{datetime(*(time.strptime(date_string, + format)[0:6]))}. \exception{ValueError} is raised if the date_string and + format can't be parsed by \function{time.strptime()} or if it returns a + value which isn't a time tuple. +\end{methoddesc} + Class attributes: \begin{memberdesc}{min} diff --git a/Lib/test/test_datetime.py b/Lib/test/test_datetime.py index ab7bd7185a7..d1f312da7ea 100644 --- a/Lib/test/test_datetime.py +++ b/Lib/test/test_datetime.py @@ -1421,6 +1421,15 @@ class TestDateTime(TestDate): # Else try again a few times. self.failUnless(abs(from_timestamp - from_now) <= tolerance) + def test_strptime(self): + import time + + string = '2004-12-01 13:02:47' + format = '%Y-%m-%d %H:%M:%S' + expected = self.theclass(*(time.strptime(string, format)[0:6])) + got = self.theclass.strptime(string, format) + self.assertEqual(expected, got) + def test_more_timetuple(self): # This tests fields beyond those tested by the TestDate.test_timetuple. t = self.theclass(2004, 12, 31, 6, 22, 33) diff --git a/Misc/ACKS b/Misc/ACKS index a582d907fb6..3c192ad1d5a 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -548,6 +548,7 @@ Dirk Soede Paul Sokolovsky Clay Spence Per Spilling +Joshua Spoerri Noah Spurrier Oliver Steele Greg Stein diff --git a/Misc/NEWS b/Misc/NEWS index 26edc897046..5ad39e29dc8 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -31,6 +31,8 @@ Extension Modules This allows islice() to work more readily with slices: islice(s.start, s.stop, s.step) +- datetime.datetime() now has a strptime class method which can be used to + create datetime object using a string and format. Library ------- diff --git a/Modules/datetimemodule.c b/Modules/datetimemodule.c index 4b4b2c5f968..7c1a6d0c593 100644 --- a/Modules/datetimemodule.c +++ b/Modules/datetimemodule.c @@ -3798,6 +3798,46 @@ datetime_utcfromtimestamp(PyObject *cls, PyObject *args) return result; } +/* Return new datetime from time.strptime(). */ +static PyObject * +datetime_strptime(PyObject *cls, PyObject *args) +{ + PyObject *result = NULL, *obj, *module; + const char *string, *format; + + if (!PyArg_ParseTuple(args, "ss:strptime", &string, &format)) + return NULL; + + if ((module = PyImport_ImportModule("time")) == NULL) + return NULL; + obj = PyObject_CallMethod(module, "strptime", "ss", string, format); + Py_DECREF(module); + + if (obj != NULL) { + int i, good_timetuple = 1; + long int ia[6]; + if (PySequence_Check(obj) && PySequence_Size(obj) >= 6) + for (i=0; i < 6; i++) { + PyObject *p = PySequence_GetItem(obj, i); + if (PyInt_Check(p)) + ia[i] = PyInt_AsLong(p); + else + good_timetuple = 0; + Py_DECREF(p); + } + else + good_timetuple = 0; + if (good_timetuple) + result = PyObject_CallFunction(cls, "iiiiii", + ia[0], ia[1], ia[2], ia[3], ia[4], ia[5]); + else + PyErr_SetString(PyExc_ValueError, + "unexpected value from time.strptime"); + Py_DECREF(obj); + } + return result; +} + /* Return new datetime from date/datetime and time arguments. */ static PyObject * datetime_combine(PyObject *cls, PyObject *args, PyObject *kw) @@ -4419,6 +4459,11 @@ static PyMethodDef datetime_methods[] = { PyDoc_STR("timestamp -> UTC datetime from a POSIX timestamp " "(like time.time()).")}, + {"strptime", (PyCFunction)datetime_strptime, + METH_VARARGS | METH_CLASS, + PyDoc_STR("string, format -> new datetime parsed from a string " + "(like time.strptime()).")}, + {"combine", (PyCFunction)datetime_combine, METH_VARARGS | METH_KEYWORDS | METH_CLASS, PyDoc_STR("date, time -> datetime with same date and time fields")},