Как получить текущее время в виде 13-значного целого числа в Ruby?

У меня есть функция jQuery, которая возвращает текущее время в виде количества миллисекунд с начала эпохи (1 января 1970 года):

time = new Date().getTime();

Есть ли способ сделать то же самое в Ruby?

Сейчас я использую Ruby Time.now.to_i, который прекрасно работает, но возвращает 10-значное целое число ( количество секунд)

Как заставить его отображать количество миллисекунд, как в jQuery?

70 голосов | спросил Tintin81 31 +04002012-10-31T03:06:31+04:00312012bEurope/MoscowWed, 31 Oct 2012 03:06:31 +0400 2012, 03:06:31

7 ответов


0
require 'date'

p DateTime.now.strftime('%s') # "1384526946" (seconds)
p DateTime.now.strftime('%Q') # "1384526946523" (milliseconds)
ответил steenslag 15 52013vEurope/Moscow11bEurope/MoscowFri, 15 Nov 2013 18:51:05 +0400 2013, 18:51:05
0

Javascript gettime() возвращает количество миллисекунд с начала эпохи.

Ruby's Time.now.to_i даст вам количество секунд с начала эпохи. Если вы измените это на Time.now.to_f, вы все равно получите секунды, но с дробным компонентом. Просто умножьте это на 1000, и вы получите миллисекунды. Затем используйте #to_i, чтобы преобразовать его в целое число. И вы в конечном итоге:

(Time.now.to_f * 1000).to_i
ответил Anthony DeSimone 31 +04002012-10-31T03:16:29+04:00312012bEurope/MoscowWed, 31 Oct 2012 03:16:29 +0400 2012, 03:16:29
0

(Time.now.to_f * 1000).to_i должен сделать то же самое.

ответил Zach Kemp 31 +04002012-10-31T03:12:26+04:00312012bEurope/MoscowWed, 31 Oct 2012 03:12:26 +0400 2012, 03:12:26
0

Будьте осторожны, не запутайтесь. Тот факт, что Ruby поддерживает идею дробных секунд как числа с плавающей запятой, на самом деле не делает его числом с плавающей запятой. У меня возникли проблемы с этим, когда я проводил сравнение временных меток Wireshark в Python ... расчеты времени в 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 значащих цифр, но факт остается фактом: числа с плавающей точкой на компьютерах являются приблизительными. Счетчики наносекунд на современных компьютерах являются целыми числами.

ответил Mike S 11 AMpSat, 11 Apr 2015 01:06:38 +030006Saturday 2015, 01:06:38
0

Получите Time объект с Time.now, вызов #to_i возвращает метку времени Unix (секунды с начала эпохи). #to_f дает доли секунды, которые можно использовать для получения миллисекунд с начала эпохи:

Time.now.to_f * 1000
ответил levinalex 15 52013vEurope/Moscow11bEurope/MoscowFri, 15 Nov 2013 17:16:38 +0400 2013, 17:16:38
0

Использование 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

Тем не менее, как отмечено в документации , "IEEE" 754 double не является достаточно точным, чтобы представлять количество наносекунд со времени эпохи ", поэтому, если вы действительно действительно заботитесь, рассмотрите to_r вместо to_f -

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

- хотя, если вы округляетесь до миллисекунд, с вами, вероятно, все в порядке.

ответил David Moles 2 J0000006Europe/Moscow 2015, 22:28:43
0

Целочисленное значение типа (1e6 * Time.now.to_f) возвращает Bignum, который может содержать миллисекунды

ответил chava 3 J000000Friday15 2015, 03:25:27

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132