如何在Ruby中将当前时间作为13位整数?
我有这个jQuery
函数,它返回当前时间作为自纪元(1970年1月1日)以来的毫秒数:
time = new Date().getTime();
有没有办法在Ruby中做同样的事情?
现在,我正在使用Ruby的Time.now.to_i
,它工作得很好,但返回一个10位整数(秒数)
我怎样才能让它显示毫秒数,就像在jQuery
?
require 'date' p DateTime.now.strftime('%s') # "1384526946" (seconds) p DateTime.now.strftime('%Q') # "1384526946523" (milliseconds)
Javascript的gettime()
返回自纪元以来的毫秒数。
Ruby的Time.now.to_i
将为您提供自纪元以来的秒数。 如果将其更改为Time.now.to_f
,则仍会获得秒数,但使用小数组件。 只需乘以1,000就可以得到毫秒数。 然后使用#to_i
将其转换为整数。 你最终得到:
(Time.now.to_f * 1000).to_i
(Time.now.to_f * 1000).to_i
应该做同样的事情。
小心,不要混淆。 事实上,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位有效数字是安全的,但事实仍然是:计算机上的浮点数是近似值。 现代计算机上的纳秒计数器是整数。
使用Time.now
获取Time对象,调用#to_i
将返回Unix时间戳(从纪元开始的秒数)。 #to_f
给出小数秒,你可以用它来从纪元获得毫秒:
Time.now.to_f * 1000
使用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_f
with round
:
2.2.2 :010 > (t.to_f * 1000).round => 1433272616889
也就是说,如文档中所述 ,“IEEE 754 double不足以表示自Epoch以来的纳秒数”,所以如果您真的非常关心,请考虑to_r
而不是to_f
–
2.2.2 :011 > (t.to_r * 1000).round => 1433272616889
– 虽然如果你只是四舍五入到几毫秒,你可能会很好。
类型转换整数(1e6 * Time.now.to_f)返回一个可以保持毫秒数的Bignum
- 具有HTTPS,SSL客户端证书和Keep-Alive支持的Ruby的HTTP库?
- 智能地生成组合的组合
- 使用Paperclip和AWS上传大文件时出错
- Ruby Unit :: Test通过忽略空格来比较html输出
- 正则表达式是什么意思?
- 如何使用Ruby使用一个换行连续替换多行换行符
- Rails button_to没有路由匹配{:action =>“complete”,:controller =>“dashboard”,:name =>“Order”}
- 随机慢速Rack :: MethodOverride#调用Heroku上的rails应用程序
- 如何使用Net :: HTTP :: Post将XML发布到RESTFUL Web服务?