如何在Ruby中以13位整数的形式获取当前时间?

如何在Ruby中以13位整数的形式获取当前时间?,ruby,Ruby,我有一个jQuery函数,它将当前时间作为自历元(1970年1月1日)以来的毫秒数返回: 在Ruby中有没有同样的方法 现在,我正在使用Ruby的Time.now.to_I,它工作得很好,但返回一个10位数的整数(秒数) 如何让它显示毫秒数,如在jQuery中所示?(Time.now.to_f*1000)。to_I应该做同样的事情。Javascript的gettime()返回自epoch以来的毫秒数 Ruby的Time.now.to_i将给出自epoch以来的秒数。如果您将其更改为Time.no

我有一个
jQuery
函数,它将当前时间作为自历元(1970年1月1日)以来的毫秒数返回:

在Ruby中有没有同样的方法

现在,我正在使用Ruby的
Time.now.to_I
,它工作得很好,但返回一个10位数的整数(秒数)

如何让它显示毫秒数,如在jQuery中所示?

(Time.now.to_f*1000)。to_I
应该做同样的事情。

Javascript的
gettime()
返回自epoch以来的毫秒数

Ruby的
Time.now.to_i
将给出自epoch以来的秒数。如果您将其更改为
Time.now.to_f
,您仍然可以获得秒,但带有分数分量。只要乘以1000,就有毫秒。然后使用
#to_i
将其转换为整数。你最终会得到:

(Time.now.to_f * 1000).to_i
获取具有
时间的对象。现在
,调用
#to_i
返回Unix时间戳(从历元算起的秒数)
#to_f
给出小数秒,可用于从历元中获取毫秒数:

Time.now.to_f * 1000

小心点,别弄糊涂了。Ruby支持分数秒作为浮点数的想法,但事实上它并不是一个浮点数。我在Python中进行Wireshark时间戳比较时遇到了这个问题。。。pcap ng中的时间计算不起作用。只有当我把这两个部分(积分秒和积分纳秒)作为两个整数处理时,我才能得到正确的数字

那是因为浮点数有。事实上,一小段Ruby会告诉你to_f并不等于nsec:

irb(main):019:0> t=Time.now
=> 2015-04-10 16:41:35 -0500
irb(main):020:0> puts "#{t.to_f}; #{t.nsec}"
1428702095.1435847; 143584844
警告程序员。您可以安全地使用3个有效数字,但事实仍然是:计算机上的浮点数是近似值。现代计算机上的纳秒计数器是整数。

使用,您可以获得秒数并附加分数毫秒(或更小的单位,如果需要):

请注意,尽管这不是舍入,但它会截断,正如您在
to_f
中看到的,或者如果您在几微秒之外:

2.2.2 :003 > t.to_f
 => 1433272616.888615
2.2.2 :004 > t.usec
 => 888615 
to_f
/
to_i
解决方案也有同样的问题(
to_i
不舍入,它):

因此,如果您真的关心毫秒精度,更好的选择可能是
to\u f

这样说,“IEEE 754的双精度不足以代表新纪元以来的纳秒数”,因此,如果你真的很关心,请考虑“<代码> toAFF -< /P>


--虽然如果你只是四舍五入到毫秒,你可能没问题。

typecast整数(1e6*Time.now.to\f)返回一个可以容纳毫秒的Bignum

非常感谢你的解释!这整件事还是新鲜事。。。实际上不知道哪一个答案是正确的…只是为了进一步了解,
Time。现在
来自Ruby,因为
Time。当前的
来自Rails。因此,
Time.current
由Rails应用程序时区和
Time确认。现在,
使用服务器时区。根据我的经验,在Rails应用程序上始终使用
Time.current
来实现时区一致性不,您根本不应该在这里使用
Time.current
,它需要更长的时间来构建,而且因为您要立即将其转换为unix时间戳,所以您根本不关心时区一致性。(Unix时间戳始终与UTC相关)。因此,虽然您所说的在99%的情况下都是正确的,但这一个性能方面在最后1%的情况下下降了。这是我首选的方法。我喜欢做的一件事是扩充Time类,添加一个
:epoch
方法:class Time def epoch(self.to_f*1000)end@brauliobo想详细说明一下它是如何伪造的吗?你的说法有误导性,OP的答案绝对正确。那不是一个“jQuery函数”,它只是一个普通的ECMAScript(javascript)。也许这就是为什么会出现-1,虽然有点苛刻。另请参见Rails用户注意事项:
ActiveSupport::TimeWithZone
提供的
strftime
方法不包括
%s
%Q
说明符。您需要首先使用
to_DateTime
方法将其转换为普通的Ruby
DateTime
。@LonnonFoster现在可以工作了(刚刚在Rails控制台中测试过)。您好,我如何做同样的事情,但不是现在,而是从日期字段?请注意,这是截断而不是舍入(正如您从示例中看到的-1384526946523ms应该是138452947S)。更好的响应。谢谢。也可以使用指令格式
.strftime(“%9N”)
。这会伪造milliseconds@brauliobo这“假毫秒”是怎么回事?您是否花时间执行代码并亲自检查?@brauliobo什么是假毫秒?@brauliobo没有,因为
to_f
将毫秒作为小数点。
irb(main):019:0> t=Time.now
=> 2015-04-10 16:41:35 -0500
irb(main):020:0> puts "#{t.to_f}; #{t.nsec}"
1428702095.1435847; 143584844
2.2.2 :001 > t = Time.new
 => 2015-06-02 12:16:56 -0700 
2.2.2 :002 > t.strftime('%s%3N')
 => "1433272616888" 
2.2.2 :003 > t.to_f
 => 1433272616.888615
2.2.2 :004 > t.usec
 => 888615 
2.2.2 :009 > (t.to_f * 1000).to_i
 => 1433272616888
2.2.2 :010 > (t.to_f * 1000).round
 => 1433272616889
2.2.2 :011 > (t.to_r * 1000).round
 => 1433272616889