]> granicus.if.org Git - python/commitdiff
Add strptime() constructor to datetime class. Thanks to Josh Spoerri for
authorSkip Montanaro <skip@pobox.com>
Thu, 13 Jan 2005 04:12:31 +0000 (04:12 +0000)
committerSkip Montanaro <skip@pobox.com>
Thu, 13 Jan 2005 04:12:31 +0000 (04:12 +0000)
the changes.

Doc/lib/libdatetime.tex
Lib/test/test_datetime.py
Misc/ACKS
Misc/NEWS
Modules/datetimemodule.c

index caf6bbc2679ceddb60515278b68f5cd0f6585d63..7f8b8bbcc09bb66a532f88b7e88848f022d28c00 100644 (file)
@@ -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}
index ab7bd7185a795cb76aa38f550ec01a227d6c18a5..d1f312da7eadd5a34acd91ee54e9ff49a2ceb304 100644 (file)
@@ -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)
index a582d907fb637fe20e051ed99cefc7ae1b2c396a..3c192ad1d5ad49e57ae35bd5d63ad5f594f7c319 100644 (file)
--- 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
index 26edc897046e3d00959d5f41f7cea2eb376e1617..5ad39e29dc8b038b0d7b5a882e498571073a1482 100644 (file)
--- 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
 -------
index 4b4b2c5f9687d1355cf75256641f772f6e30e11a..7c1a6d0c593759d109b6f1c5eb4e68514289169b 100644 (file)
@@ -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")},