python将日期转换为时间戳_将日期时间转换为时间戳并返回
一般情况下,带小数位的浮点数值无法准确表示为二进制浮点数;这些表示中通常包含极其微小的误差。然而,在某些情况下计算结果会略低于预期数值,在其他情况下可能会略微超出(但仍应与预期值极为接近)。例如您提供的数值为1391147980.0019989013671875,在此基准下其与目标值之间的差异不超过半个微秒时间。
建议在将浮点timestamp转换为datetime时采用四舍五入的方法。如J.F Sebastian所指出的一般情况下这是一项针对Python 3.x版本的一个已知问题后来已修复了但这一问题仍然存在于Python 3.x.x版本中例如Python 3.x.x.x及其以上的版本并未解决这一缺陷这一缺陷可能导致不同时间戳之间的转换存在较大的误差特别是在精确匹配和低微秒范围内的数值转换差异显著
鉴于您已知原始值是以微秒为单位的整数值,请您考虑在数值计算中引入一个校正量(偏差),从而将二进制浮点表示与对应的十进制表示进行精确比较。这种校正量应被设计得足够小,在舍入操作发生时才不会干扰计算结果的质量。具体而言,在舍入操作应在0.5微秒处触发的情况下,请确定理想校正量应等于该基准的一半(即0.25微秒)。
该程序中运行的结果如下所示:>>> a = datetime.datetime.timestamp(datetime.datetime(2014, 1, 30, 23, 59, 40, 1999))
b = datetime.datetime.fromtimestamp(a)
a
1391147980.001999
b
datetime.datetime(2014, 1, 30, 23, 59, 40, 1998)
b = datetime.datetime.fromtimestamp(a + 0.00000025)
b
datetime.datetime(2014, 1, 30, 23, 59, 40, 1999)
counter={}
for i in range(0,1000000):
fuzz up some random-ish dates
d = datetime.datetime(1990+(i%20), 1+(i%12), 1+(i%28), i%24, i%60, i%60, i)
ts = datetime.datetime.timestamp(d)
b = datetime.datetime.fromtimestamp(ts + 0.00000025)
msdif = d.microsecond - b.microsecond
if msdif in counter:
counter[msdif] += 1
else:
counter[msdif]=1
assert the day of b equals the day of d as well as the hour, minute, and second also match
counter
{0: 1000000}
