Ruby에서 현재 시간을 13 자리 정수로 얻는 방법은 무엇입니까? 이후 밀리 초 수로 현재

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)


답변

자바 스크립트 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.to_f * 1000).to_i 같은 일을해야합니다.


답변

를 사용하여 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_fround같습니다.

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 개의 유효 숫자로 안전 할 수 있지만 사실은 남아 있습니다. 컴퓨터의 부동 소수점 숫자는 근사치입니다. 현대 컴퓨터의 나노초 카운터는 정수입니다.


답변

를 사용하여 Time 객체를 가져 오고 Time.now호출 #to_i하면 Unix 타임 스탬프 (epoch에서 초)를 반환합니다. #to_fepoch에서 밀리 초를 가져 오는 데 사용할 수있는 분수 초를 제공합니다.

Time.now.to_f * 1000


답변

typecast Integer (1e6 * Time.now.to_f)는 밀리 초를 저장할 수있는 Bignum을 반환합니다.