【问题标题】:Timestamp out of range for platform localtime()/gmtime() function平台 localtime()/gmtime() 函数的时间戳超出范围
【发布时间】:2016-07-10 20:19:29
【问题描述】:

我试试:

ts = -216345600000
datetime.datetime.fromtimestamp(ts/1000)

ValueError:平台 localtime()/gmtime() 函数的时间戳超出范围

我查看epochconverter 值:-216345600 其返回 GMT:1963 年 2 月 23 日星期六 00:00:00 GMT

如何得到正确的结果?

【问题讨论】:

标签: python datetime timestamp


【解决方案1】:

可能与问题中的问题相关性稍差,但可能适用于那些想要在没有任何非常具体的解决方法的情况下表示完整的日期时间范围默认datetime实现的限制。

我检查了一些库,我建议使用:

dateparser - 用于解析以人类和多种语言自然表述的日期/时间。

arrow - 无限制地替代datetime(例如,可以表示公元 1 年之前和接近的日期)。

【讨论】:

  • 感谢箭头模块!
  • 我在蒙特利尔。我使用了 utcnow() 函数,它给了我 16:20。但现在是蒙特利尔的 12:20。为什么会有这种差异?
  • UTC = 世界协调时间或 GMT。蒙特利尔的时区是 (GMT-4) 因此读数。 GMT 适用于伦敦。
  • 现在明白了!谢谢!我改用 arrow.now() 函数。
【解决方案2】:

对于许多值,例如过去或未来太远,只需将时间戳提供给fromtimestamp() 就会报错超出范围错误。但是,您可以使用来自纪元的timedelta() relative 来计算日期。

>>> from datetime import datetime, timedelta
>>> date = datetime(1970, 1, 1) + timedelta(seconds=-216345600)
>>> date
datetime.datetime(1963, 2, 23, 0, 0)
>>> date.strftime('%a, %d %b %Y %H:%M:%S GMT')
'Sat, 23 Feb 1963 00:00:00 GMT'

但是,请注意,您不能使用它回到恐龙时代,因为datetime() 仍然有它可以支持的最小值和最大值。

>>> datetime(1970, 1, 1) + timedelta(seconds=-62135596800)
datetime.datetime(1, 1, 1, 0, 0)
>>> datetime(1970, 1, 1) + timedelta(seconds=253402300799)
datetime.datetime(9999, 12, 31, 23, 59, 59)
>>> datetime(1970, 1, 1) + timedelta(seconds=253402300800)

Traceback (most recent call last):
  File "<pyshell#157>", line 1, in <module>
    datetime(1970, 1, 1) + timedelta(seconds=253402300800)
OverflowError: date value out of range

timedelta() 也有其局限性,但以时代为参考点,我们甚至还没有达到。

>>> timedelta(microseconds=1000000000*86400*10000-1)
datetime.timedelta(9999999, 86399, 999999)

【讨论】:

  • 我不明白为什么要除以 1000。
  • @D.O.我没有除以 1000。也许你指的是 OP 做了什么?在那种情况下,他将毫秒转换为秒。
猜你喜欢
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 2023-01-27
  • 2020-05-10
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
  • 2018-04-07
相关资源
最近更新 更多