homepage

This issue tracker has been migrated to GitHub , and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: [Windows] datetime.fromtimestamp(t) when 0 <= t <= 86399 fails on Python 3.6
Type: behavior Stage: resolved
Components: Windows Versions: Python 3.8, Python 3.7, Python 3.6
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: Nosy List: SilentGhost, ammar2, belopolsky, jleclanche, p-ganssle, paul.moore, pekka.klarck, planders, r.david.murray, steve.dower, tim.golden, tim.peters, vstinner, zach.ware
Priority: normal Keywords: patch

Created on 2016年12月28日 20:49 by pekka.klarck, last changed 2022年04月11日 14:58 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
forego_fold_detection.patch ammar2, 2016年12月30日 11:08 review
truncate_negatives.patch ammar2, 2016年12月30日 11:08 review
Pull Requests
URL Status Linked Edit
PR 2385 merged ammar2, 2017年06月24日 23:02
PR 8466 merged miss-islington, 2018年07月25日 16:55
PR 8498 merged ammar2, 2018年07月27日 10:13
Messages (16)
msg284199 - (view) Author: Pekka Klärck (pekka.klarck) Date: 2016年12月28日 20:49
For example:
E:\>py -3.6 -c "import datetime; datetime.datetime.fromtimestamp(42)"
Traceback (most recent call last):
 File "<string>", line 1, in <module>
OSError: [Errno 22] Invalid argument
Works fine at least with Python 2.6-2.7 and 3.3-3.5. Only tested on Windows (missing deadsnakes for easy Linux testing).
I was also surprised to get OSError in general, but apparently fromtimestamp uses that instead of ValueError nowadays in some error situations.
msg284250 - (view) Author: SilentGhost (SilentGhost) * (Python triager) Date: 2016年12月29日 12:08
This doesn't seem likely that it's anything to do with datetime, could you try reproducing it in repl?
msg284264 - (view) Author: Ammar Askar (ammar2) * (Python committer) Date: 2016年12月29日 14:15
Can recreate successfully on windows, but not on linux:
> C:\Python36\python.exe -c "import datetime; datetime.datetime.fromtimestamp(42)"
Traceback (most recent call last):
 File "<string>", line 1, in <module>
OSError: [Errno 22] Invalid argument
> C:\Python36\python.exe
Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime; datetime.datetime.fromtimestamp(42)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
OSError: [Errno 22] Invalid argument
msg284265 - (view) Author: SilentGhost (SilentGhost) * (Python triager) Date: 2016年12月29日 14:35
Cannot reproduce this with the tip on linux
msg284269 - (view) Author: R. David Murray (r.david.murray) * (Python committer) Date: 2016年12月29日 14:52
Sounds like it really is an OSError (that is, that the Windows OS is the source of the error). Whether or not we can or should do something about that is a separate question, though.
msg284272 - (view) Author: Ammar Askar (ammar2) * (Python committer) Date: 2016年12月29日 15:28
The 86,399 upperbound comes from this line (max_fold_seconds=86400):
https://github.com/python/cpython/blob/master/Modules/_datetimemodule.c#L4277-L4278
The bug is introduced as part of the fold detection in this commit: https://github.com/python/cpython/commit/56376cacd2a0f6af834fe4d2a20b1a1095afb26f
Window's locatime_s function gives an EINVAL error when time is less than 0. Which is where the OSError comes from.
https://msdn.microsoft.com/en-us/library/a442x3ye.aspx 
msg284281 - (view) Author: Ammar Askar (ammar2) * (Python committer) Date: 2016年12月29日 17:00
I just ran the following script to check if there are any folds from timestamps [0, 86399] in any timezone.
 import datetime
 import pytz
 for tz in pytz.all_timezones:
 tz = pytz.timezone(tz)
 for i in range(86400):
 if datetime.datetime.fromtimestamp(i, tz).fold == 1:
 print(str(tz)) 
and it turns out there aren't any. I highly doubt any timezone is going to retroactively enable/disable DST during the epoch, so a potentially hacky fix is to just have a windows specific check for this value range.
I'm adding the people involved in PEP 495 to the nosy list so they can give their input.
msg284286 - (view) Author: Alexander Belopolsky (belopolsky) * (Python committer) Date: 2016年12月29日 18:11
I think we should just clip the negative lower probe value to 0 on Windows before passing it to local(). Also, if we still care about platforms with 32-bit time_t, we should check for over/under flow *before* calling local().
msg284326 - (view) Author: Ammar Askar (ammar2) * (Python committer) Date: 2016年12月30日 11:08
I've attached two patches that fix this behavior, one by simply foregoing the fold detection for this time range on windows (the patch that I'd argue is simpler and more readable)
And one that truncates the passed values to local to not be negative. This one would have been simple but unfortunately there's the complication that there are two local calls and additionally, the second one cannot be truncated to exactly 0 because then we incorrectly detect a fold for the timestamp 0.
msg296214 - (view) Author: Alexander Belopolsky (belopolsky) * (Python committer) Date: 2017年06月16日 17:26
> I just ran the following script to check if there are any folds from timestamps [0, 86399] in any timezone.
Ammar, I am not sure pytz timezones support PEP 495 conventions. Can you repeat your experiment using the latest dateutil.tz or test.datetimetester.ZoneInfo from Python 3.6 test suit?
See <http://dateutil.readthedocs.io/en/stable/tz.html>.
msg296759 - (view) Author: Ammar Askar (ammar2) * (Python committer) Date: 2017年06月24日 08:38
Hey, sorry for the late response. I just ran:
 import datetime
 from dateutil.zoneinfo import get_zonefile_instance
 import dateutil.tz
 zonenames = list(get_zonefile_instance().zones)
 for tz in zonenames:
 tz = dateutil.tz.gettz(tz)
 for i in range(86400):
 if datetime.datetime.fromtimestamp(i, tz).fold == 1:
 print(str(tz))
tz uses your OS's zone info so also posting my distro version:
Debian 8.8 - 3.16.0-4-amd64 #1 SMP Debian 3.16.43-2 (2017年04月30日) x86_64 GNU/Linux
And I got the same result, no timezone with folds in these range.
msg296795 - (view) Author: Ammar Askar (ammar2) * (Python committer) Date: 2017年06月24日 23:03
Created a github pull request for the recommended patch along with a test: https://github.com/python/cpython/pull/2385 
msg309084 - (view) Author: Jerome Leclanche (jleclanche) Date: 2017年12月27日 14:10
Anything holding up the PR? Looks good at a glance, would be nice to get this landed in time for 3.7.
msg322370 - (view) Author: Alexander Belopolsky (belopolsky) * (Python committer) Date: 2018年07月25日 16:55
New changeset 96d1e69a12ed8ab80203277e1abdaf573457a964 by Alexander Belopolsky (Ammar Askar) in branch 'master':
bpo-29097: Forego fold detection on windows for low timestamp values (GH-2385)
https://github.com/python/cpython/commit/96d1e69a12ed8ab80203277e1abdaf573457a964
msg322392 - (view) Author: Alexander Belopolsky (belopolsky) * (Python committer) Date: 2018年07月25日 20:34
New changeset 973649342cee3869409f341ff0f0e3d2b1547c2a by Alexander Belopolsky (Miss Islington (bot)) in branch '3.7':
bpo-29097: Forego fold detection on windows for low timestamp values (GH-2385) (GH-8466)
https://github.com/python/cpython/commit/973649342cee3869409f341ff0f0e3d2b1547c2a
msg322496 - (view) Author: Alexander Belopolsky (belopolsky) * (Python committer) Date: 2018年07月27日 14:59
New changeset 6ea8a3a0ebf840ca57b6dba9cad26fbb0ddaa5d4 by Alexander Belopolsky (Ammar Askar) in branch '3.6':
[3.6] bpo-29097: Forego fold detection on windows for low timestamp values (GH-2385) (GH-8498)
https://github.com/python/cpython/commit/6ea8a3a0ebf840ca57b6dba9cad26fbb0ddaa5d4
History
Date User Action Args
2022年04月11日 14:58:41adminsetgithub: 73283
2020年03月23日 17:27:54SilentGhostunlinkissue36759 superseder
2019年11月01日 18:22:28p-ganssleunlinkissue37527 superseder
2019年11月01日 14:38:58p-gansslelinkissue37527 superseder
2019年05月19日 17:13:23SilentGhostlinkissue36759 superseder
2018年07月27日 16:33:03ammar2setstatus: open -> closed
resolution: fixed
stage: patch review -> resolved
2018年07月27日 14:59:34belopolskysetmessages: + msg322496
2018年07月27日 10:13:32ammar2setpull_requests: + pull_request8016
2018年07月25日 20:34:16belopolskysetmessages: + msg322392
2018年07月25日 16:55:11miss-islingtonsetpull_requests: + pull_request7990
2018年07月25日 16:55:01belopolskysetmessages: + msg322370
2018年07月05日 15:04:57p-gansslesetnosy: + p-ganssle
2018年06月28日 22:46:32vstinnersettitle: datetime.fromtimestamp(t) when 0 <= t <= 86399 fails on Python 3.6 -> [Windows] datetime.fromtimestamp(t) when 0 <= t <= 86399 fails on Python 3.6
2018年06月28日 17:37:07eryksunsetstage: needs patch -> patch review
versions: + Python 3.7, Python 3.8
2017年12月27日 14:10:28jleclanchesetnosy: + jleclanche
messages: + msg309084
2017年08月22日 20:27:55planderssetnosy: + planders
2017年06月24日 23:03:14ammar2setmessages: + msg296795
2017年06月24日 23:02:35ammar2setpull_requests: + pull_request2434
2017年06月24日 08:38:09ammar2setmessages: + msg296759
2017年06月16日 17:26:21belopolskysetmessages: + msg296214
2017年06月16日 17:06:14r.david.murraylinkissue30684 superseder
2017年01月03日 12:52:38vstinnersetnosy: + vstinner
2016年12月30日 11:08:56ammar2setfiles: + truncate_negatives.patch
2016年12月30日 11:08:44ammar2setfiles: + forego_fold_detection.patch
keywords: + patch
messages: + msg284326
2016年12月29日 18:11:00belopolskysetmessages: + msg284286
2016年12月29日 17:00:53ammar2setnosy: + tim.peters
messages: + msg284281
2016年12月29日 15:28:04ammar2setmessages: + msg284272
2016年12月29日 14:52:39r.david.murraysetnosy: + r.david.murray
messages: + msg284269
2016年12月29日 14:35:22SilentGhostsetmessages: + msg284265
2016年12月29日 14:34:03SilentGhostsetnosy: + belopolsky, paul.moore, tim.golden, zach.ware, steve.dower

type: behavior
components: + Windows
stage: needs patch
2016年12月29日 14:15:05ammar2setnosy: + ammar2
messages: + msg284264
2016年12月29日 12:08:25SilentGhostsetnosy: + SilentGhost
messages: + msg284250
2016年12月28日 20:49:20pekka.klarckcreate

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