【问题标题】:Unable to convert datetime to timestamp before the year 1970 [duplicate]无法将日期时间转换为 1970 年之前的时间戳 [重复]
【发布时间】:2020-11-23 09:51:52
【问题描述】:

我正在尝试将 datetime 对象转换为时间戳,以便我可以将时间戳保存到 json 文件中,然后我可以将该时间戳转换为 datetime 对象。

在我将年份设置为大于 1970 之前,这一直很好,但是当减少年份时,出现异常,说 OSError: [Errno 22] Invalid argument

import datetime
cd = datetime.datetime.strptime("1965-12-25", "%Y-%m-%d")
datetime.datetime.timestamp(cd) # this line gives error
Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
OSError: [Errno 22] Invalid argument

我使用的是 Windows 10 操作系统。是否有任何例外或其他方式将日期时间转换为时间戳?

【问题讨论】:

  • 它会给出一个负值
  • 时间戳 0(或 1)是 1970 年 1 月 1 日 00:00:00,那么时间戳在此日期之前并不存在
  • @Christophe 您可以使用该日期的负偏移量来表示之前的日期......
  • Sunil,你真的应该使用cd.timestamp() 而不是datetime.datetime.timestamp(cd),但这只是顺便说一句……
  • 来自time module's docs:“此模块中的函数可能无法处理纪元之前或未来遥远的日期和时间

标签: python python-3.x datetime timestamp


【解决方案1】:

您可以从纪元 (1970-1-1) 将负时间戳计算为 timedelta

import datetime
cd = datetime.datetime.strptime("1965-12-25", "%Y-%m-%d")

ts = (cd-datetime.datetime(1970,1,1)).total_seconds()

print(ts)
>>> -126835200.0

...反之亦然

dt = datetime.datetime(1970, 1, 1) + datetime.timedelta(seconds=ts)
print(dt)
>>> 1965-12-25 00:00:00

相关:

【讨论】:

    猜你喜欢
    • 2016-12-17
    • 1970-01-01
    • 2014-04-11
    • 2018-09-12
    • 2014-06-26
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    相关资源
    最近更新 更多