You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Inconsistencies with datetime.fromtimestamp(t) when t < 0 #80620
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
assignee=Noneclosed_at=Nonecreated_at=<Date2019-03-26.15:18:26.163>labels= ['3.8', 'type-bug', '3.7']
title='Inconsistencies with datetime.fromtimestamp(t) when t < 0'updated_at=<Date2020-10-14.01:11:02.349>user='https://github.com/BoboTiG'
changed the title [-][Windows] datetime.fromtimestamp(t) when t < 0 fails on Python 3.6[/-][+]OSes inconsistency whith datetime.fromtimestamp(t) when t < 0[/+]on Mar 26, 2019
changed the title [-]OSes inconsistency whith datetime.fromtimestamp(t) when t < 0[/-][+]Inconsistencies with datetime.fromtimestamp(t) when t < 0[/+]on Mar 26, 2019
fromtimestamp() may raise OverflowError, if the timestamp is out of the range
of values supported by the platform C localtime() or gmtime() functions, and
OSError on localtime() or gmtime() failure. It’s common for this to be
restricted to years in 1970 through 2038. Note that on non-POSIX systems that
include leap seconds in their notion of a timestamp, leap seconds are ignored
by fromtimestamp(), and then it’s possible to have two timestamps differing by
a second that yield identical datetime objects. See also utcfromtimestamp().
So this is indeed the documented behavior. I agree that it would be good to unify the behavior across platforms if possible, but I think this would require us to have our own implementation of localtime() and/or gmtime().
That said, it might be possible to implement fromtimestamp with some equivalent of datetime(1970, 1, 1) + timedelta(seconds=t) on Windows when the value falls outside the accepted range. We'd probably need some better tests under different time zones to make sure that that would be acceptable.
I think it may be a good idea to change the targeted version to 3.8 or 3.9, because this is a change to the documented behavior of the function (albeit a desirable one that can probably be considered backwards compatible).
This has been coming up in a few different contexts lately, so I think it would be really good if we could get some sort of fix for it.
One option is to implement our own versions of these APIs for use in Windows, but a thought occurred to me recently: we have not investigated the possibility of seeing if Microsoft would be willing to either add support for negative timestamps in their localtime() or gmtime() implementations or add a new API that *does* support negative timestamps. It would also be good to rule out the possibility that such APIs already exist but we just don't know about them (preliminary googling doesn't show anything, though possibly something can be done with the Win32 APIs? Not sure how or if those work in C and how big a lift it would be to maintain compatibility if can switch: https://docs.microsoft.com/en-us/windows/win32/sysinfo/time-functions?redirectedfrom=MSDN ).
Adding Steve Dower to the nosy list in case he can shed some light onto the possibility of native support.
I've emailed some colleagues to see what they can add here.
Ultimately, the Windows CRT is just doing arithmetic, since POSIX time formats do not resemble Windows time formats at all, so it's all emulation. So if we replaced it with our own calculation I don't think that would be the worst possible outcome.
PaulAntonLetnes commented on Jun 10, 2020
PaulAntonLetnesmannequin
Mannequin
More actions
I've encountered an issue on anaconda python on windows 10 v1909 which I suspect is related. It looks like no dates in 1970 can be converted to datetime.timestamp():
Python 3.8.2 (default, Apr 14 2020, 19:01:40) [MSC v.1916 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 7.13.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: import datetime
In [2]: datetime.datetime(1970, 1, 2, 0, 0, 1, 123456).timestamp()
---------------------------------------------------------------------------
I've encountered an issue on anaconda python on windows 10 v1909 which I suspect is related. It looks like no dates in 1970 can be converted to datetime.timestamp():
Python 3.15.0a5+ (heads/main:f5685a266b2, Jan 15 2026, 10:57:22) [MSC v.1944 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> from time import localtime
>>> localtime(-1)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=13, tm_min=59, tm_sec=59, tm_wday=3, tm_yday=1, tm_isdst=-1)
Activity
BoboTiG commentedon Mar 26, 2019
A similar issue was resolved with bpo-29097 (with 0 <= t <= 86399).
Here, we have an inconsistency between OSes when using datetime.fromtimestamp(t) when t < 0.
Tested on Python 3.6.7.
GNU/Linux:
macOS:
Windows (7 and 10):
I think having a similar behavior between all Oses would be great, right?
BoboTiG commentedon Mar 26, 2019
Reproduced on 3.6.8 and 3.7.3.
BoboTiG commentedon Mar 26, 2019
And also reproduced on 3.8.0a3.
[-][Windows] datetime.fromtimestamp(t) when t < 0 fails on Python 3.6[/-][+]OSes inconsistency whith datetime.fromtimestamp(t) when t < 0[/+][-]OSes inconsistency whith datetime.fromtimestamp(t) when t < 0[/-][+]Inconsistencies with datetime.fromtimestamp(t) when t < 0[/+]pganssle commentedon Mar 28, 2019
From the documentation ( https://docs.python.org/3/library/datetime.html#datetime.datetime.fromtimestamp ):
So this is indeed the documented behavior. I agree that it would be good to unify the behavior across platforms if possible, but I think this would require us to have our own implementation of localtime() and/or gmtime().
That said, it might be possible to implement
fromtimestampwith some equivalent ofdatetime(1970, 1, 1) + timedelta(seconds=t)on Windows when the value falls outside the accepted range. We'd probably need some better tests under different time zones to make sure that that would be acceptable.I think it may be a good idea to change the targeted version to 3.8 or 3.9, because this is a change to the documented behavior of the function (albeit a desirable one that can probably be considered backwards compatible).
pganssle commentedon Nov 1, 2019
This has been coming up in a few different contexts lately, so I think it would be really good if we could get some sort of fix for it.
One option is to implement our own versions of these APIs for use in Windows, but a thought occurred to me recently: we have not investigated the possibility of seeing if Microsoft would be willing to either add support for negative timestamps in their localtime() or gmtime() implementations or add a new API that *does* support negative timestamps. It would also be good to rule out the possibility that such APIs already exist but we just don't know about them (preliminary googling doesn't show anything, though possibly something can be done with the Win32 APIs? Not sure how or if those work in C and how big a lift it would be to maintain compatibility if can switch: https://docs.microsoft.com/en-us/windows/win32/sysinfo/time-functions?redirectedfrom=MSDN ).
Adding Steve Dower to the nosy list in case he can shed some light onto the possibility of native support.
zooba commentedon Nov 1, 2019
I've emailed some colleagues to see what they can add here.
Ultimately, the Windows CRT is just doing arithmetic, since POSIX time formats do not resemble Windows time formats at all, so it's all emulation. So if we replaced it with our own calculation I don't think that would be the worst possible outcome.
PaulAntonLetnes commentedon Jun 10, 2020
I've encountered an issue on anaconda python on windows 10 v1909 which I suspect is related. It looks like no dates in 1970 can be converted to datetime.timestamp():
Python 3.8.2 (default, Apr 14 2020, 19:01:40) [MSC v.1916 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 7.13.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: import datetime
In [2]: datetime.datetime(1970, 1, 2, 0, 0, 1, 123456).timestamp()
---------------------------------------------------------------------------
OSError: [Errno 22] Invalid argument
In [3]: datetime.datetime(1971, 1, 2, 0, 0, 1, 123456).timestamp()
Out[3]: 31618801.123456
Dobatymo commentedon Oct 14, 2020
Yeah... there is more related weirdness going on.
9 remaining items
vstinner commentedon Jan 15, 2026
Fixed by #143463.
vstinner commentedon Jan 15, 2026
Negative timestamps are now accepted on Windows:
encukou commentedon Jan 15, 2026
This broke
test_timeon some buildbots.[edit] Looks like some of the new tests aren't compatible with
time_ton 32-bit arches; they fail without the change too.pythongh-80620: Fix test_time.test_gmtime() for 32-bit time_t
vstinner commentedon Jan 15, 2026
Right, I noticed that. I wrote #143861 to fix test_gmtime() on 32-bit systems.
gh-80620: Fix test_time.test_gmtime() for 32-bit time_t (#143861)
encukou commentedon Jan 15, 2026
Thank you!
pythongh-80620: Fix test_time.test_gmtime() for 32-bit time_t (python…
pythongh-80620: Support negative timestamps on windows in `time.gmtim…
pythongh-80620: Fix test_time.test_gmtime() for 32-bit time_t (python…
hugovk commentedon Mar 10, 2026
This started failing now the US switched to DST: