changeset: 75611:5d6a5c5a4ebe user: Victor Stinner date: Wed Mar 14 00:15:40 2012 +0100 files: Doc/library/datetime.rst Misc/NEWS Modules/_datetimemodule.c description: Issue #14180: datetime.date.fromtimestamp(), datetime.datetime.fromtimestamp() and datetime.datetime.utcfromtimestamp() now raise an OSError instead of ValueError if localtime() or gmtime() failed. diff -r 217fdeeaf6e0 -r 5d6a5c5a4ebe Doc/library/datetime.rst --- a/Doc/library/datetime.rst Tue Mar 13 18:02:22 2012 -0400 +++ b/Doc/library/datetime.rst Wed Mar 14 00:15:40 2012 +0100 @@ -404,7 +404,8 @@ .. versionchanged:: 3.3 Raise :exc:`OverflowError` instead of :exc:`ValueError` if the timestamp is out of the range of values supported by the platform C - :c:func:`localtime` function. + :c:func:`localtime` function. Raise :exc:`OSError` instead of + :exc:`ValueError` on :c:func:`localtime` failure. .. classmethod:: date.fromordinal(ordinal) @@ -720,7 +721,9 @@ .. versionchanged:: 3.3 Raise :exc:`OverflowError` instead of :exc:`ValueError` if the timestamp is out of the range of values supported by the platform C - :c:func:`localtime` or :c:func:`gmtime` functions + :c:func:`localtime` or :c:func:`gmtime` functions. Raise :exc:`OSError` + instead of :exc:`ValueError` on :c:func:`localtime` or :c:func:`gmtime` + failure. .. classmethod:: datetime.utcfromtimestamp(timestamp) @@ -750,7 +753,8 @@ .. versionchanged:: 3.3 Raise :exc:`OverflowError` instead of :exc:`ValueError` if the timestamp is out of the range of values supported by the platform C - :c:func:`gmtime` function. + :c:func:`gmtime` function. Raise :exc:`OSError` instead of + :exc:`ValueError` on :c:func:`gmtime` failure. .. classmethod:: datetime.fromordinal(ordinal) diff -r 217fdeeaf6e0 -r 5d6a5c5a4ebe Misc/NEWS --- a/Misc/NEWS Tue Mar 13 18:02:22 2012 -0400 +++ b/Misc/NEWS Wed Mar 14 00:15:40 2012 +0100 @@ -33,6 +33,10 @@ - Issue #14184: Increase the default stack size for secondary threads on Mac OS X to avoid interpreter crashes when using threads on 10.7. +- Issue #14180: datetime.date.fromtimestamp(), + datetime.datetime.fromtimestamp() and datetime.datetime.utcfromtimestamp() + now raise an OSError instead of ValueError if localtime() or gmtime() failed. + - Issue #14180: time.ctime(), gmtime(), time.localtime(), datetime.date.fromtimestamp(), datetime.datetime.fromtimestamp() and datetime.datetime.utcfromtimestamp() now raises an OverflowError, instead of diff -r 217fdeeaf6e0 -r 5d6a5c5a4ebe Modules/_datetimemodule.c --- a/Modules/_datetimemodule.c Tue Mar 13 18:02:22 2012 -0400 +++ b/Modules/_datetimemodule.c Wed Mar 14 00:15:40 2012 +0100 @@ -2443,22 +2443,25 @@ { struct tm *tm; time_t t; - PyObject *result = NULL; if (_PyTime_ObjectToTime_t(obj, &t) == -1) return NULL; tm = localtime(&t); - if (tm) - result = PyObject_CallFunction(cls, "iii", - tm->tm_year + 1900, - tm->tm_mon + 1, - tm->tm_mday); - else - PyErr_SetString(PyExc_ValueError, - "timestamp out of range for " - "platform localtime() function"); - return result; + if (tm == NULL) { + /* unconvertible time */ +#ifdef EINVAL + if (errno == 0) + errno = EINVAL; +#endif + PyErr_SetFromErrno(PyExc_OSError); + return NULL; + } + + return PyObject_CallFunction(cls, "iii", + tm->tm_year + 1900, + tm->tm_mon + 1, + tm->tm_mday); } /* Return new date from current time. @@ -4057,33 +4060,33 @@ PyObject *tzinfo) { struct tm *tm; - PyObject *result = NULL; tm = f(&timet); - if (tm) { - /* The platform localtime/gmtime may insert leap seconds, - * indicated by tm->tm_sec> 59. We don't care about them, - * except to the extent that passing them on to the datetime - * constructor would raise ValueError for a reason that - * made no sense to the user. - */ - if (tm->tm_sec> 59) - tm->tm_sec = 59; - result = PyObject_CallFunction(cls, "iiiiiiiO", - tm->tm_year + 1900, - tm->tm_mon + 1, - tm->tm_mday, - tm->tm_hour, - tm->tm_min, - tm->tm_sec, - us, - tzinfo); + if (tm == NULL) { +#ifdef EINVAL + if (errno == 0) + errno = EINVAL; +#endif + return PyErr_SetFromErrno(PyExc_OSError); } - else - PyErr_SetString(PyExc_ValueError, - "timestamp out of range for " - "platform localtime()/gmtime() function"); - return result; + + /* The platform localtime/gmtime may insert leap seconds, + * indicated by tm->tm_sec> 59. We don't care about them, + * except to the extent that passing them on to the datetime + * constructor would raise ValueError for a reason that + * made no sense to the user. + */ + if (tm->tm_sec> 59) + tm->tm_sec = 59; + return PyObject_CallFunction(cls, "iiiiiiiO", + tm->tm_year + 1900, + tm->tm_mon + 1, + tm->tm_mday, + tm->tm_hour, + tm->tm_min, + tm->tm_sec, + us, + tzinfo); } /* Internal helper. @@ -4102,7 +4105,7 @@ if (_PyTime_ObjectToTimeval(timestamp, &timet, &us) == -1) return NULL; - return datetime_from_timet_and_us(cls, f, timet, us, tzinfo); + return datetime_from_timet_and_us(cls, f, timet, (int)us, tzinfo); } /* Internal helper.

AltStyle によって変換されたページ (->オリジナル) /