У меня есть эта jQuery
функция, которая возвращает текущее время как количество миллисекунд с эпохи (1 января 1970 г.):
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)
источник
strftime
метод , предоставляемыйActiveSupport::TimeWithZone
не включает%s
и%Q
определители.DateTime
Сначала вам нужно преобразовать в простой Ruby , используяto_datetime
метод.Javascript
gettime()
возвращает количество миллисекунд с начала эпохи.Ruby
Time.now.to_i
даст вам количество секунд с начала эпохи. Если вы измените это значение наTime.now.to_f
, вы все равно получите секунды, но с дробной составляющей. Просто умножьте это на 1000, и вы получите миллисекунды. Затем используйте,#to_i
чтобы преобразовать его в целое число. И вы получите:(Time.now.to_f * 1000).to_i
источник
Time.now
происходит от Ruby, посколькуTime.current
происходит от Rails. Таким образомTime.current
, распознается часовой пояс приложения Rails иTime.now
используется часовой пояс сервера. По моему опыту, всегда используйтеTime.current
в своем приложении Rails для согласованности часовыхTime.current
здесь, это требует больше времени для построения, и, поскольку вы сразу конвертируете его в метку времени unix, вас вообще не заботит согласованность часовых поясов. (Временные метки Unix всегда относятся к UTC). Итак, хотя то, что вы говорите, верно в 99% случаев, этот показатель с точки зрения производительности падает в последнем 1%.:epoch
расширять класс Time, добавляя метод: class Time def epoch (self.to_f * 1000) .to_i end end(Time.now.to_f * 1000).to_i
должен делать то же самое.источник
to_f
миллисекунды являются десятичными.Используя
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
- хотя, если вы округляете только до миллисекунд, вы, вероятно, в порядке.
источник
Будьте осторожны, не запутайтесь. Тот факт, что 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
Будьте программистом. Вы можете быть уверены в трех значащих цифрах, но факт остается фактом: числа с плавающей запятой на компьютерах являются приблизительными. Счетчики наносекунд на современных компьютерах являются целыми числами.
источник
.strftime("%9N")
Также можно использовать формат директивы . ruby-doc.org/core-2.3.1/Time.html#method-i-strftimeПолучить объект Time с помощью
Time.now
, вызов#to_i
возвращает отметку времени Unix (секунды от эпохи).#to_f
дает дробные секунды, которые вы можете использовать для получения миллисекунд от эпохи:Time.now.to_f * 1000
источник
Целое число с приведением типов (1e6 * Time.now.to_f) возвращает Bignum, который может содержать миллисекунды.
источник