datetime.timestamp() fails before 1970-01-02T01:00:00.000000
Opened this issue · 6 comments
Python 3.8.10
datetime 4.4
Windows 10
datetime(1970,1,1,0,0,0).timestamp() # OSError: [Errno 22] Invalid argument
datetime(1970,1,1,23,59,59,999999).timestamp() # OSError: [Errno 22] Invalid argument
datetime(1970,1,2,0,59,59,999999).timestamp() # OSError: [Errno 22] Invalid argument
Minimal datetime where timestamp() is fine:
datetime(1970,1,2,1,0,0).timestamp() # 86400.0
Probable duplicate of https://bugs.python.org/issue37527
datetime(1970,1,1,0,0,0, tzinfo=None).timestamp() # OSError: [Errno 22] Invalid argument
datetime(1970,1,1,0,0,0, tzinfo=timezone.utc).timestamp() # 0.0
Cannot reproduce this on Arch with python 3.10.5 with the system clock set to UTC+1. Perhaps this only affects Windows. Are you able to reproduce this using python 3.10?
sam@samtop ~ % python
Python 3.10.5 (main, Jun 6 2022, 18:49:26) [GCC 12.1.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from datetime import datetime, timezone
>>> datetime(1970,1,1,0,0,0, tzinfo=None).timestamp()
-3600.0
>>> datetime(1970,1,1,0,0,0, tzinfo=timezone.utc).timestamp()
0.0
>>> import time
>>> time.tzname
('GMT', 'BST')
>>>
C:\>py -3.10
Python 3.10.5 (tags/v3.10.5:f377153, Jun 6 2022, 16:14:13) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from datetime import datetime, timezone
>>> datetime(1970,1,1,0,0,0, tzinfo=None).timestamp()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 22] Invalid argument
>>> datetime(1970,1,1,0,0,0, tzinfo=timezone.utc).timestamp()
0.0
>>> import time
>>> time.tzname
('Romance Standard Time', 'Romance Daylight Time')
>>>
This should come from the fact that without any timezone specified, the lib relies on the Windows function which does not support times before the Epoch. The strange thing is that the whole day after the Epoch is unusable, which cannot be explained only by time zone.
While running property-based tests with Hypothesis, I discovered that datetime.timestamp()
also fails with the same error on Windows 10 x64 for datetimes after datetime.datetime(3001, 1, 19, 7, 59, 59, 999999)
.
Specifically:
> datetime.datetime(3001, 1, 19, 7, 59, 59, 999999).timestamp()
32536800000.0
> datetime.datetime(3001, 1, 19, 8, 0, 0, 0).timestamp()
OSError: [Errno 22] Invalid argument
I suspect this is related to the max value of the argument to time.ctime
on Windows 10 x64 as discussed in this Stack Overflow thread.
This issue is present on Windows 10 for Python 9, Python10 and Python11, and on Windows 11 for Python 11. I did not tested it on Python 9 and Python 10 on Windows 11.
In addition to the timestamp()
function, a similar error is raised with the astimezone()
function. For example, the following code fail with an OSError: [Errno 22] Invalid argument
error:
import dateime
a = datetime.datetime(1901, 12, 25)
b = a.astimezone(tz=datetime.timezone.utc)
Note: This issue is likely related to #81708