为什么python的datetime.max能够通过timestamp / fromtimestamp实现往返?

时间:2016-08-25 19:53:41

标签: python python-3.x datetime

在大多数情况下,我可以将日期时间往返于时间戳,如下所示:

from datetime import datetime

dt = datetime(2016, 1, 1, 12, 34, 56, 789)
print(dt)
print(datetime.fromtimestamp(dt.timestamp()))
  

2016-01-01 12:34:56.000789

     

2016-01-01 12:34:56.000789

但这对datetime.max不起作用。那是为什么?

dt = datetime.max
print(dt)
print(datetime.fromtimestamp(dt.timestamp()))
  

9999-12-31 23:59:59.999999

     

Traceback(最近一次调用最后一次):文件   " python",第9行,在ValueError:year超出范围

更确切地说,为什么没有考虑这个案例的日期时间库?

2 个答案:

答案 0 :(得分:1)

只是因为datetime对象的最大值与有效时间戳的最大值不同。

还有一个很好的理由来限制时间戳的范围:它们只是一个简单的python float,在" normal"机器是双精度浮点。但是:你的精确度会下降超过几秒钟:

print(datetime.max.timestamp())
253402297200.0
print(datetime.max.second)
59
print(datetime.max.microsecond)
999999

发现错误。

基于浮点数的时间戳,按照定义将来越不准确。因此,无法在时间戳中表示任意有效datetimes是完全合理的,就像将来限制几千年一样。

这样:

  

更确切地说,为什么没有考虑这个案例的日期时间库?

因为将来到目前为止的时间戳不可靠并且很可能并不代表你所说的时间,所以拒绝它们是明智之举。

外卖:像timestamp()生成的浮点数不是以固定精度传输时间的合适方式。如果你可以,可以避免它。

答案 1 :(得分:0)

dt = datetime.max

正在检查datetime类的最大值。这是一个静态值。

datetime.fromtimestamp(dt.timestamp()))

然而,这是针对时间戳的。不同的班级,不同的方法。 Here是日期时间方法的文档。