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

9

我在代码中两次使用 .timestamp() 函数,将datetime对象转换为epoch时间。第一次调用 .timestamp() 如下:

import datetime    
origin_epoch = origin.timestamp()
originorigin_epoch变量的内容如下所示:

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

与此同时,如果我尝试在代码中的其他位置调用相同的方法...
import datetime
print(datetime.datetime(1900, 1, 1, 19, 6, 28).timestamp())

我遇到了如下错误:OSError: [Errno 22] Invalid argument。这是为什么呢?
编辑:此错误发生在Windows 10上。
3个回答

8
这似乎是一个已知问题,据说已经修复,但我没有检查。在我的Windows上(Windows 10,GMT +2),任何1970-01-02 02:00:00之前或3001-01-19 07:59:59之后的日期调用timestamp()时都会出现OSError
然而,对于带偏移量的datetime,不会发生这种情况,相反,timestamp()的调用会被计算为(来自文档):
(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()

如果您使用的是偏移量无关的日期时间,您可以简单地使用:

(dt - datetime(1970, 1, 1)).total_seconds()

7

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

不过,在我的macOS上这很好用:

>>> datetime.datetime(1900, 1, 1, 19, 6, 28).timestamp()
-2208929029.0

哇,我从来没有想到过这个。非常感谢!有趣的是,如果你不指定年份,datetime模块的默认年份是1900年。因此,在Windows上,每当你在一个带有默认年份的datetime对象上运行timestamp()时,程序都会崩溃并显示“Errno 22”。 - David
1
@David,这个问题也许会有所帮助。 - ForceBru

-1

我将年份值替换为2000,现在它可以正常工作了。

time_sec = datetime.strptime("00:00:13.345", "%H:%M:%S.%f")
print(time_sec.replace(year=2000).timestamp())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接