例如,时间戳是1403667010.574
,使用Time.at(1403667010.574).strftime('%Y-%m-%d %H:%M:%S.%L %z')
,则结果为
"2014-06-25 03:30:10.573 +0000"
它在结果上损失了 1 毫秒。那是 ruby 的错误吗?
对我来说,主要问题是,如果我将时间字符串转换为 Time.parse("2014-06-25 03:30:10.573 +0000").to_f
,结果将是变为 1403667010.573
。它不等于原始值
最佳答案
这就是 float 的工作原理。它们大致精确(并非绝对)。
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"
另外,这就是Time#strftime documentation说到 %L
标志:
%L - Millisecond of the second (000..999) The digits under millisecond are truncated to not produce 1000.
因此,值 .573999
被截断(未四舍五入)为 .573
关于ruby strftime 给出错误的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24405679/