ruby strftime给出了错误的时间
例如,时间戳为1403667010.574,使用Time.at1403667010.574。strftime“%Y-%m-%d%H:%m:%S.%L%z”,则结果为ruby strftime给出了错误的时间,ruby,time,Ruby,Time,例如,时间戳为1403667010.574,使用Time.at1403667010.574。strftime“%Y-%m-%d%H:%m:%S.%L%z”,则结果为 "2014-06-25 03:30:10.573 +0000" 它在结果上损失了1ms。那是ruby的bug吗 对我来说,主要的问题是,如果我按time.parse2014-06-25 03:30:10.573+0000.to_f转换时间字符串,结果将变成1403667010.573。它不等于原点值这是浮点数的工作原理。它们是近似
"2014-06-25 03:30:10.573 +0000"
它在结果上损失了1ms。那是ruby的bug吗
对我来说,主要的问题是,如果我按time.parse2014-06-25 03:30:10.573+0000.to_f转换时间字符串,结果将变成1403667010.573。它不等于原点值这是浮点数的工作原理。它们是近似精确的,不是绝对精确的
t = Time.at(1403667010.574)
t.strftime('%Y-%m-%d %H:%M:%S.%L %z') # => "2014-06-25 07:30:10.573 +0400"
# more precision
t.strftime('%Y-%m-%d %H:%M:%S.%6N %z') # => "2014-06-25 07:30:10.573999 +0400"
# even more precision
t.strftime('%Y-%m-%d %H:%M:%S.%10N %z') # => "2014-06-25 07:30:10.5739998817 +0400"
此外,这是关于%L标志的说明:
%L-秒000..999中的毫秒
毫秒以下的数字被截断,不产生1000
因此,值.573999只是被截断而不是四舍五入到.573,这就是浮点数的工作原理。它们是近似精确的,不是绝对精确的
t = Time.at(1403667010.574)
t.strftime('%Y-%m-%d %H:%M:%S.%L %z') # => "2014-06-25 07:30:10.573 +0400"
# more precision
t.strftime('%Y-%m-%d %H:%M:%S.%6N %z') # => "2014-06-25 07:30:10.573999 +0400"
# even more precision
t.strftime('%Y-%m-%d %H:%M:%S.%10N %z') # => "2014-06-25 07:30:10.5739998817 +0400"
此外,这是关于%L标志的说明:
%L-秒000..999中的毫秒
毫秒以下的数字被截断,不产生1000
因此,值.573999只是被截断而不是四舍五入到.573不,这不是ruby的错误。这是你的错误。不要把你的错误归咎于别人。更谦虚一点。使用Time.at1403667010,574000可以得到更精确的结果。不,这不是ruby的bug。这是你的错误。不要把你的错误归咎于别人。更谦虚一点。利用时间。at1403667010、574000可能会更精确result@sawa:如果没有浮点精度部分,就不清楚.573999是从哪里来的。@塞吉奥:我不知道为什么Time.parse2014-06-25 03:30:10.573+0000.usec可以得到正确的浮点部分574000,但是Time.at1403667010.574.usec无法573999@Yehudi:如果我想知道这一点,我会去看看Time.parse和Time.at的实现。有些不同。至少,一个接受字符串,另一个接受-anumber@sawa:如果没有浮点精度部分,就不清楚.573999是从哪里来的。@塞吉奥:我不知道为什么Time.parse2014-06-25 03:30:10.573+0000.usec可以得到正确的浮点部分574000,但是Time.at1403667010.574.usec无法573999@Yehudi:如果我想知道这一点,我会去看看Time.parse和Time.at的实现。有些不同。至少,一个接受字符串,另一个接受数字