[ruby] 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_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 개의 유효 숫자로 안전 할 수 있지만 사실은 남아 있습니다. 컴퓨터의 부동 소수점 숫자는 근사치입니다. 현대 컴퓨터의 나노초 카운터는 정수입니다.
답변
를 사용하여 Time 객체를 가져 오고 Time.now
호출 #to_i
하면 Unix 타임 스탬프 (epoch에서 초)를 반환합니다. #to_f
epoch에서 밀리 초를 가져 오는 데 사용할 수있는 분수 초를 제공합니다.
Time.now.to_f * 1000
답변
typecast Integer (1e6 * Time.now.to_f)는 밀리 초를 저장할 수있는 Bignum을 반환합니다.