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

时间:2012-10-30 23:06:31

标签: ruby

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

time = new Date().getTime();

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

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

如何让它显示毫秒数,如jQuery

7 个答案:

答案 0 :(得分:131)

require 'date'

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

答案 1 :(得分:89)

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

Ruby的Time.now.to_i将为您提供自纪元以来的秒数。如果将其更改为Time.now.to_f,则仍会获得秒数,但会使用小数组件。只需乘以1,000就可以得到毫秒数。然后使用#to_i将其转换为整数。最后你得到了:

(Time.now.to_f * 1000).to_i

答案 2 :(得分:24)

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

答案 3 :(得分:16)

小心,不要混淆。事实上,Ruby支持小数秒的概念,因为浮点数实际上并没有使它成为一个浮点数。当我在Python中进行Wireshark时间戳时间比较时,我遇到了麻烦... pcap-ng中的时间计算只是没有用。只有当我处理这两个部分(整数秒和整数纳秒)时,因为两个整数才能得到正确的数字。

那是因为浮点数有Accuracy problems。实际上,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位有效数字是安全的,但事实仍然是:计算机上的浮点数是近似值。现代计算机上的纳秒计数器是整数。

答案 4 :(得分:13)

使用Time.now获取Time对象,调用#to_i将返回Unix时间戳(从纪元开始的秒数)。 #to_f给出小数秒,您可以使用它来从纪元获得毫秒:

Time.now.to_f * 1000

答案 5 :(得分:11)

使用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 round可能更好,2.2.2 :010 > (t.to_f * 1000).round => 1433272616889

to_f

也就是说,noted in the docs,“IEEE 754 double不足以表示自Epoch以来的纳秒数”,所以如果你真的非常关心,请考虑{{3而不是2.2.2 :011 > (t.to_r * 1000).round => 1433272616889 -

public CentralStation(MySqlConnection _myConnection)
{
    InitializeComponent();
    myConnection = _myConnection;
    myAdapter = new MySqlDataAdapter();
    myCommand = new MySqlCommand(" ", myConnection);
    myDataTable = new DataTable();
    myBinder = new BindingSource();

    PopulateTableSelection();
}

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        myCommand.CommandText = "SELECT * FROM tcpro." + this.tableMenuList.Text + ";";
        myAdapter.SelectCommand = myCommand;
        myDataTable.Clear();
        myAdapter.Fill(myDataTable);
        myBinder.DataSource = null;
        myBinder.DataSource = myDataTable;
        dataGridView1.DataSource = myBinder;
        myAdapter.Update(myDataTable);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

- 虽然如果你只是四舍五入到几毫秒,那你就可以了。

答案 6 :(得分:0)

类型转换整数(1e6 * Time.now.to_f)返回一个可以保持毫秒的Bignum