如何在Ruby中将当前时间获取为13位整数?


88

我有一个jQuery函数,该函数返回当前时间(自epoch(1970年1月1日)以来的毫秒数):

time = new Date().getTime();

有没有办法在Ruby中做同样的事情?

现在,我使用的RubyTime.now.to_i效果很好,但返回的是10位整数(秒数)

如何获得显示毫秒数的信息,如中所示jQuery


5
那不是“ jQuery函数”,而只是普通的ECMAScript(javascript)。也许这就是促使-1变强的原因。
RobG 2012年

Answers:


151
require 'date'

p DateTime.now.strftime('%s') # "1384526946" (seconds)
p DateTime.now.strftime('%Q') # "1384526946523" (milliseconds)

31
给Rails用户的注意事项:strftime提供的方法ActiveSupport::TimeWithZone不包括%s%Q指示符。您首先需要DateTime使用to_datetime方法转换为纯Ruby 。
Lonnon Foster 2014年

6
@LonnonFoster现在可以正常工作(仅在Rails控制台中进行了测试)。
NikolaStojaković17年

嗨,我该怎么做,但不是现在,而是从日期字段中做同样的事情?
Tomer,


100

Javascriptgettime()返回自纪元以来的毫秒数。

RubyTime.now.to_i将为您提供自纪元以来的秒数。如果将其更改为Time.now.to_f,您仍然会得到秒数,但具有小数部分。只需将其乘以1,000,就可以得到毫秒数。然后使用#to_i将其转换为整数。结果是:

(Time.now.to_f * 1000).to_i

非常感谢您的解释!整件事仍然是新的...不知道哪个答案实际上被标记为正确的答案
Tintin81

1
只是出于进一步的信息,Time.now它来自Ruby,而Time.current来自Rails。因此Time.current,Rails应用程序时区已确认它并Time.now正在使用服务器时区。根据我的经验,请始终Time.current在您的Rails应用程序上使用以确保时区一致性
vutran

1
不,您根本不应该Time.current在这里使用它,它会花费更长的时间,并且由于您将立即将其转换为unix时间戳,因此您根本不需要关心时区的一致性。(Unix时间戳始终与UTC有关)。因此,虽然您说的是在99%的情况下都是正确的,但从性能角度来看,这仅是最后1%。
The Pellmeister's

1
这是我的首选方法。我想做的一件事是扩充Time类以添加一个:epoch方法:Time def epoch类(self.to_f * 1000).to_i end end
Matt Welke

1
这是假的毫秒
brauliobo


20

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

2.2.2 :001 > t = Time.new
 => 2015-06-02 12:16:56 -0700 
2.2.2 :002 > t.strftime('%s%3N')
 => "1433272616888" 

请注意,尽管这种方法不能四舍五入,但是会被截断,正如您所看到的那样,to_f或者如果您用了微秒的话:

2.2.2 :003 > t.to_f
 => 1433272616.888615
2.2.2 :004 > t.usec
 => 888615 

to_f/to_i解决方案具有相同的问题:

2.2.2 :009 > (t.to_f * 1000).to_i
 => 1433272616888

所以,如果你真的关心毫秒的精度,更好的选择可能是to_fround

2.2.2 :010 > (t.to_f * 1000).round
 => 1433272616889

这就是说,如在文档指出,“IEEE 754双不够准确,以表示自从大纪元纳秒数”,所以如果你真的真的不在乎,考虑to_r代替to_f-

2.2.2 :011 > (t.to_r * 1000).round
 => 1433272616889 

-尽管如果只舍入到毫秒,则可能很好。


18

注意,不要感到困惑。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个有效数字安全,但事实仍然存在:计算机上的浮点数是近似值。现代计算机上的纳秒计数器是整数。


更好的响应。谢谢。指令格式.strftime("%9N")也可以使用。 ruby-doc.org/core-2.3.1/Time.html#method-i-strftime
rplaurindo '16

13

使用获取一个Time对象Time.now,调用#to_i将返回Unix时间戳(距纪元为秒)。 #to_f给出小数秒,可用于从纪元获取毫秒:

Time.now.to_f * 1000

3
这是假的毫秒
brauliobo

0

类型转换Integer(1e6 * Time.now.to_f)返回一个可以容纳毫秒的Bignum

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.