jQuery
에포크 (1970 년 1 월 1 일) 이후 밀리 초 수로 현재 시간을 반환하는 이 함수가 있습니다.
time = new Date().getTime();
Ruby에서 동일한 작업을 수행 할 수있는 방법이 있습니까?
지금 Time.now.to_i
은 훌륭하게 작동하지만 10 자리 정수 (초)를 반환하는 Ruby를 사용 하고 있습니다.
에서와 같이 밀리 초 수를 표시하려면 jQuery
어떻게해야합니까?
jQuery
에포크 (1970 년 1 월 1 일) 이후 밀리 초 수로 현재 시간을 반환하는 이 함수가 있습니다.
time = new Date().getTime();
Ruby에서 동일한 작업을 수행 할 수있는 방법이 있습니까?
지금 Time.now.to_i
은 훌륭하게 작동하지만 10 자리 정수 (초)를 반환하는 Ruby를 사용 하고 있습니다.
에서와 같이 밀리 초 수를 표시하려면 jQuery
어떻게해야합니까?
답변:
require 'date'
p DateTime.now.strftime('%s') # "1384526946" (seconds)
p DateTime.now.strftime('%Q') # "1384526946523" (milliseconds)
strftime
제공 하는 메서드 ActiveSupport::TimeWithZone
에는 %s
및 %Q
지정자가 포함 되어 있지 않습니다 . DateTime
먼저 to_datetime
메서드를 사용하여 일반 Ruby로 변환해야합니다 .
자바 스크립트 gettime()
는 epoch 이후 밀리 초 수를 반환합니다.
Ruby Time.now.to_i
는 epoch 이후의 초 수를 제공합니다. 으로 변경 Time.now.to_f
하면 여전히 초를 얻지 만 분수 구성 요소가 있습니다. 여기에 1,000을 곱하면 밀리 초가됩니다. 그런 다음을 사용 #to_i
하여 정수로 변환하십시오. 그리고 결국 :
(Time.now.to_f * 1000).to_i
Time.now
왔기 때문에 Ruby에서 가져 왔습니다 Time.current
. 따라서 Time.current
Rails 애플리케이션 시간대에 의해 인식되고 Time.now
서버 시간대를 사용 하고 있습니다. 내 경험에 의하면, 항상 사용 Time.current
시간대의 일관성에 대한 Rails 애플리케이션에
Time.current
여기서는 전혀 사용하지 않아야하며 구성하는 데 시간이 오래 걸리며 즉시 유닉스 타임 스탬프로 변환하므로 시간대 일관성에 대해 전혀 신경 쓰지 않습니다. (Unix 타임 스탬프는 항상 UTC와 관련이 있습니다). 그래서 당신이 말하는 것은 99 %의 경우에 사실이지만, 이것은 성능면에서 마지막 1 %에 속합니다.
:epoch
메서드 를 추가하는 것입니다. 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 배의 신기원 이후 나노초의 수를 나타내는 정확한 충분하지 않다" 정말 걱정, 생각 to_r
대신에 to_f
-
2.2.2 :011 > (t.to_r * 1000).round
=> 1433272616889
-밀리 초 단위로만 반올림하는 경우에는 괜찮습니다.
조심하세요. 혼동하지 마세요. 루비가 소수의 초를 부동 소수점으로 지원한다는 사실은 실제로 부동 소수점 숫자가되지는 않습니다. 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