在大多数情况下,我可以将日期时间往返于时间戳,如下所示:
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超出范围
更确切地说,为什么没有考虑这个案例的日期时间库?
答案 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是日期时间方法的文档。