@@ -119,6 +119,10 @@ static PyTypeObject PyDateTime_DeltaType;
119119static PyTypeObject PyDateTime_TimeType ;
120120static PyTypeObject PyDateTime_TZInfoType ;
121121static PyTypeObject PyDateTime_TimeZoneType ;
122+ static PyObject * datetime_strptime (PyObject * cls , PyObject * args );
123+ static PyObject * datetime_getdate (PyDateTime_DateTime * self );
124+ static PyObject * datetime_gettime (PyDateTime_DateTime * self );
125+
122126
123127static int check_tzinfo_subclass (PyObject * p );
124128
@@ -2870,6 +2874,33 @@ date_fromordinal(PyObject *cls, PyObject *args)
28702874 return result ;
28712875}
28722876
2877+
2878+ /* Return new date from time.strptime(). */
2879+ static PyObject *
2880+ date_strptime (PyObject * cls , PyObject * args )
2881+ {
2882+ PyObject * date = NULL ;
2883+ PyObject * datetime ;
2884+
2885+ datetime = datetime_strptime ((PyObject * )& PyDateTime_DateTimeType , args );
2886+
2887+ if (datetime == NULL )
2888+ return NULL ;
2889+
2890+ if (DATE_GET_HOUR (datetime ) ||
2891+ DATE_GET_MINUTE (datetime ) ||
2892+ DATE_GET_SECOND (datetime ) ||
2893+ DATE_GET_MICROSECOND (datetime ))
2894+ PyErr_SetString (PyExc_ValueError ,
2895+ "date.strptime value cannot have a time part" );
2896+ else
2897+ date = datetime_getdate ((PyDateTime_DateTime * )datetime );
2898+
2899+ Py_DECREF (datetime );
2900+ return date ;
2901+ }
2902+
2903+
28732904/* Return the new date from a string as generated by date.isoformat() */
28742905static PyObject *
28752906date_fromisoformat (PyObject * cls , PyObject * dtstr ) {
@@ -3203,6 +3234,11 @@ static PyMethodDef date_methods[] = {
32033234 PyDoc_STR ("Current date or datetime: same as "
32043235 "self.__class__.fromtimestamp(time.time())." )},
32053236
3237+ {"strptime" , (PyCFunction )date_strptime , METH_VARARGS | METH_CLASS ,
3238+ PyDoc_STR ("string, format -> new date instance parsed from a string.\n\n"
3239+ ">>> datetime.date.strptime('2012/07/20', '%Y/%m/%d')\n"
3240+ "datetime.date(2012, 7, 20)" )},
3241+
32063242 /* Instance methods: */
32073243
32083244 {"ctime" , (PyCFunction )date_ctime , METH_NOARGS ,
@@ -3916,6 +3952,49 @@ time_new(PyTypeObject *type, PyObject *args, PyObject *kw)
39163952 return self ;
39173953}
39183954
3955+
3956+ /* Return new time from time.strptime(). */
3957+ static PyObject *
3958+ time_strptime (PyObject * cls , PyObject * args )
3959+ {
3960+ PyObject * time = NULL ;
3961+ PyObject * datetime ;
3962+
3963+ static PyObject * emptyDatetime = NULL ;
3964+
3965+ /* To ensure that the given string does not contain a date,
3966+ * compare with the result of an empty date string.
3967+ */
3968+ if (emptyDatetime == NULL ) {
3969+ PyObject * emptyStringPair = Py_BuildValue ("ss" , "" , "" );
3970+ if (emptyStringPair == NULL )
3971+ return NULL ;
3972+ emptyDatetime = datetime_strptime (
3973+ (PyObject * )& PyDateTime_DateTimeType ,
3974+ emptyStringPair );
3975+ Py_DECREF (emptyStringPair );
3976+ if (emptyDatetime == NULL )
3977+ return NULL ;
3978+ }
3979+
3980+ datetime = datetime_strptime ((PyObject * )& PyDateTime_DateTimeType , args );
3981+
3982+ if (datetime == NULL )
3983+ return NULL ;
3984+
3985+ if (GET_YEAR (datetime ) != GET_YEAR (emptyDatetime )
3986+ || GET_MONTH (datetime ) != GET_MONTH (emptyDatetime )
3987+ || GET_DAY (datetime ) != GET_DAY (emptyDatetime ))
3988+ PyErr_SetString (PyExc_ValueError ,
3989+ "time.strptime value cannot have a date part" );
3990+ else
3991+ time = datetime_gettime ((PyDateTime_DateTime * )datetime );
3992+
3993+ Py_DECREF (datetime );
3994+ return time ;
3995+ }
3996+
3997+
39193998/*
39203999 * Destructor.
39214000 */
@@ -4334,6 +4413,14 @@ time_reduce(PyDateTime_Time *self, PyObject *arg)
43344413}
43354414
43364415static PyMethodDef time_methods [] = {
4416+ /* Class methods: */
4417+
4418+ {"strptime" , (PyCFunction )time_strptime , METH_VARARGS | METH_CLASS ,
4419+ PyDoc_STR ("string, format -> new time parsed from a string.\n\n"
4420+ ">>> datetime.time.strptime('10:40am', '%H:%M%p')\n"
4421+ "datetime.time(10, 40)" )},
4422+
4423+ /* Instance methods: */
43374424
43384425 {"isoformat" , (PyCFunction )time_isoformat , METH_VARARGS | METH_KEYWORDS ,
43394426 PyDoc_STR ("Return string in ISO 8601 format, [HH[:MM[:SS[.mmm[uuu]]]]]"
@@ -5891,8 +5978,10 @@ static PyMethodDef datetime_methods[] = {
58915978
58925979 {"strptime" , (PyCFunction )datetime_strptime ,
58935980 METH_VARARGS | METH_CLASS ,
5894- PyDoc_STR ("string, format -> new datetime parsed from a string "
5895- "(like time.strptime())." )},
5981+ PyDoc_STR ("string, format -> new datetime parsed from a string.\n\n"
5982+ ">>> datetime.datetime.strptime('2012/07/20 10:40am', "
5983+ "'%Y/%m/%d %H:%M%p')\n"
5984+ "datetime.datetime(2012, 7, 20, 10, 40)" )},
58965985
58975986 {"combine" , (PyCFunction )datetime_combine ,
58985987 METH_VARARGS | METH_KEYWORDS | METH_CLASS ,
0 commit comments