mirror of
https://github.com/python/cpython.git
synced 2025-07-24 03:35:53 +00:00
bpo-29097: Forego fold detection on windows for low timestamp values (GH-2385)
On Windows, passing a negative value to local results in an OSError because localtime_s on Windows does not support negative timestamps. Unfortunately this means that fold detection for timestamps between 0 and max_fold_seconds will result in this OSError since we subtract max_fold_seconds from the timestamp to detect a fold. However, since we know there haven't been any folds in the interval [0, max_fold_seconds) in any timezone, we can hackily just forego fold detection for this time range on Windows.
This commit is contained in:
parent
74102c9a5f
commit
96d1e69a12
4 changed files with 34 additions and 2 deletions
|
@ -4625,7 +4625,22 @@ datetime_from_timet_and_us(PyObject *cls, TM_FUNC f, time_t timet, int us,
|
|||
second = Py_MIN(59, tm.tm_sec);
|
||||
|
||||
/* local timezone requires to compute fold */
|
||||
if (tzinfo == Py_None && f == _PyTime_localtime) {
|
||||
if (tzinfo == Py_None && f == _PyTime_localtime
|
||||
/* On Windows, passing a negative value to local results
|
||||
* in an OSError because localtime_s on Windows does
|
||||
* not support negative timestamps. Unfortunately this
|
||||
* means that fold detection for time values between
|
||||
* 0 and max_fold_seconds will result in an identical
|
||||
* error since we subtract max_fold_seconds to detect a
|
||||
* fold. However, since we know there haven't been any
|
||||
* folds in the interval [0, max_fold_seconds) in any
|
||||
* timezone, we can hackily just forego fold detection
|
||||
* for this time range.
|
||||
*/
|
||||
#ifdef MS_WINDOWS
|
||||
&& (timet - max_fold_seconds > 0)
|
||||
#endif
|
||||
) {
|
||||
long long probe_seconds, result_seconds, transition;
|
||||
|
||||
result_seconds = utc_to_seconds(year, month, day,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue