为什么 Datetime 的 `.timestamp()` 方法返回 `OSError: [Errno 22] Invalid argument`?

Dav*_*vid 5 python datetime epoch python-3.x

.timestamp()在代码中两次使用该函数,将日期时间对象转换为纪元时间。第一次调用.timestamp()看起来像这样:

import datetime    
origin_epoch = origin.timestamp()
Run Code Online (Sandbox Code Playgroud)

变量的内容originorigin_epoch有:

Visual Studio Code 的变量调试器的屏幕截图。

同时,如果我尝试在代码的其他地方调用相同的方法

import datetime
print(datetime.datetime(1900, 1, 1, 19, 6, 28).timestamp())
Run Code Online (Sandbox Code Playgroud)

然后我收到以下错误:OSError: [Errno 22] Invalid argument这是为什么?

编辑:此错误发生在 Windows 10 上。

For*_*Bru 5

1900 年在UNIX 纪元开始之前,即 1970 年,因此 返回的秒数timestamp必须为负数。准确地说,应该是负数,但显然,在你的情况下不是。看起来您的操作系统只是将 UNIX 时代开始之前的日期视为错误。

不过,这在 macOS 上对我来说很好用:

>>> datetime.datetime(1900, 1, 1, 19, 6, 28).timestamp()
-2208929029.0
Run Code Online (Sandbox Code Playgroud)


Yuv*_*val 5

这似乎是一个已知问题,据说已经修复,但我还没有检查过。在我的 Windows (Windows 10, GMT+2) 上 1970-01-02 02:00:00 或之后的任何日期 3001-01-19 07:59:59 将给出OSError何时timestamp()被调用。

但是,这不会发生在偏移感知日期时间上,相反,它们被计算为(来自docs):

(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()
Run Code Online (Sandbox Code Playgroud)

事实上,对于偏移天真的日期时间,可以简单地使用:

(dt - datetime(1970, 1, 1)).total_seconds()
Run Code Online (Sandbox Code Playgroud)