Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is Datetime's `.timestamp()` method returning `OSError: [Errno 22] Invalid argument`?

I make use of the .timestamp() function twice in my code, to convert datetime objects into epoch time. The first call to .timestamp() looks like this:

import datetime    
origin_epoch = origin.timestamp()

the contents of the variables origin and origin_epoch are:

Screenshot of Visual Studio Code's debugger for variables.

Meanwhile, if I try to call the same method elsewhere in my code

import datetime
print(datetime.datetime(1900, 1, 1, 19, 6, 28).timestamp())

Then I get the following error: OSError: [Errno 22] Invalid argument Why is this?

edit: this error occurred on Windows 10.

like image 881
David Avatar asked Dec 05 '19 17:12

David


2 Answers

The year 1900 was before the beginning of the UNIX epoch, which was in 1970, so the number of seconds returned by timestamp must be negative. To be precise, should be negative, but apparently, not in your case. Looks like your OS just treats dates before the beginning of the UNIX epoch as errors.

This works fine for me on macOS, though:

>>> datetime.datetime(1900, 1, 1, 19, 6, 28).timestamp()
-2208929029.0
like image 187
ForceBru Avatar answered Oct 18 '22 01:10

ForceBru


This appears to be a known issue which has been supposedly fixed, but I haven't checked. On my Windows (Windows 10, GMT+2) any date before 1970-01-02 02:00:00 or beyond 3001-01-19 07:59:59 will give an OSError when timestamp() is called.

However, this does not happen to offset-aware datetime, instead, they get computed as (from the docs):

(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()

And indeed, for offset-naive datetimes, one can simply use:

(dt - datetime(1970, 1, 1)).total_seconds()
like image 5
Yuval Avatar answered Oct 18 '22 02:10

Yuval