平台localtime()/ gmtime()函数

时间:2016-03-23 13:43:58

标签: python datetime timestamp

我试试:

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

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

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

如何获得正确的结果?

2 个答案:

答案 0 :(得分:6)

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

>>> 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)

答案 1 :(得分:0)

与问题中的问题可能关系不大,但可能适用于希望代表整个日期时间范围而又没有任何非常具体的变通办法的人 ,以限制默认datetime实施。

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

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

arrow-不受限制地直接替换datetime(例如,可以表示公元1年之前或之前的日期)。