summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSkip Montanaro <skip@pobox.com>2005-01-13 04:12:31 (GMT)
committerSkip Montanaro <skip@pobox.com>2005-01-13 04:12:31 (GMT)
commit0af3ade6aa597a8871dbb62c312a8ab62e3cd309 (patch)
treea7d4665e4c36907f627780ebbd7bff17f2e0b46b
parent2f8c6589f5bb1a2e360d040bc38996d95bfca511 (diff)
downloadcpython-0af3ade6aa597a8871dbb62c312a8ab62e3cd309.zip
cpython-0af3ade6aa597a8871dbb62c312a8ab62e3cd309.tar.gz
cpython-0af3ade6aa597a8871dbb62c312a8ab62e3cd309.tar.bz2
Add strptime() constructor to datetime class. Thanks to Josh Spoerri for
the changes.
-rw-r--r--Doc/lib/libdatetime.tex9
-rw-r--r--Lib/test/test_datetime.py9
-rw-r--r--Misc/ACKS1
-rw-r--r--Misc/NEWS2
-rw-r--r--Modules/datetimemodule.c45
5 files changed, 66 insertions, 0 deletions
diff --git a/Doc/lib/libdatetime.tex b/Doc/lib/libdatetime.tex
index caf6bbc..7f8b8bb 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 ab7bd71..d1f312d 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 a582d90..3c192ad 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 26edc89..5ad39e2 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 4b4b2c5..7c1a6d0 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")},