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


88

jQuery에포크 (1970 년 1 월 1 일) 이후 밀리 초 수로 현재 시간을 반환하는 이 함수가 있습니다.

time = new Date().getTime();

Ruby에서 동일한 작업을 수행 할 수있는 방법이 있습니까?

지금 Time.now.to_i은 훌륭하게 작동하지만 10 자리 정수 (초)를 반환하는 Ruby를 사용 하고 있습니다.

에서와 같이 밀리 초 수를 표시하려면 jQuery어떻게해야합니까?


5
이것은 "jQuery 함수"가 아니라 평범한 ECMAScript (javascript) 일뿐입니다. 아마도 그것이 -1을 촉발시킨 것입니다.
RobG

답변:


152
require 'date'

p DateTime.now.strftime('%s') # "1384526946" (seconds)
p DateTime.now.strftime('%Q') # "1384526946523" (milliseconds)

31
Rails 사용자를위한 참고 사항 :에서 strftime제공 하는 메서드 ActiveSupport::TimeWithZone에는 %s%Q지정자가 포함 되어 있지 않습니다 . DateTime먼저 to_datetime메서드를 사용하여 일반 Ruby로 변환해야합니다 .
Lonnon Foster 2014

6
@LonnonFoster 이제 작동합니다 (Rails 콘솔에서 테스트 됨).
Nikola Stojaković

안녕하세요, 어떻게 똑같은 일을 할 수 있지만 지금은 아니지만 날짜 필드에서 할 수 있습니까?
Tomer


102

자바 스크립트 gettime() 는 epoch 이후 밀리 초 수를 반환합니다.

Ruby Time.now.to_i는 epoch 이후의 초 수를 제공합니다. 으로 변경 Time.now.to_f하면 여전히 초를 얻지 만 분수 구성 요소가 있습니다. 여기에 1,000을 곱하면 밀리 초가됩니다. 그런 다음을 사용 #to_i하여 정수로 변환하십시오. 그리고 결국 :

(Time.now.to_f * 1000).to_i

설명 해주셔서 감사합니다! 그럼에도 불구하고이 모든 일에 새로운 ... 할 일이 실제로 올바른 ... 같은 마크하는 답 알지
Tintin81

1
더 자세한 정보 는 Rails에서 Time.now왔기 때문에 Ruby에서 가져 왔습니다 Time.current. 따라서 Time.currentRails 애플리케이션 시간대에 의해 인식되고 Time.now서버 시간대를 사용 하고 있습니다. 내 경험에 의하면, 항상 사용 Time.current시간대의 일관성에 대한 Rails 애플리케이션에
vutran

1
아니요, Time.current여기서는 전혀 사용하지 않아야하며 구성하는 데 시간이 오래 걸리며 즉시 유닉스 타임 스탬프로 변환하므로 시간대 일관성에 대해 전혀 신경 쓰지 않습니다. (Unix 타임 스탬프는 항상 UTC와 관련이 있습니다). 그래서 당신이 말하는 것은 99 %의 경우에 사실이지만, 이것은 성능면에서 마지막 1 %에 속합니다.
The Pellmeister 2011

1
이것이 제가 선호하는 접근 방식입니다. 제가 좋아하는 한 가지는 Time 클래스를 확장하여 :epoch메서드 를 추가하는 것입니다. class Time def epoch (self.to_f * 1000) .to_i end end
Matt Welke

@brauliobo 밀리 초를 가짜로 만드는 방법을 자세히 설명 하시겠습니까? 귀하의 진술은 오해의 소지가 있으며 OP의 대답은 절대적으로 옳습니다.
coisnepe

31

(Time.now.to_f * 1000).to_i 같은 일을해야합니다.


1
@brauliobo 가짜 밀리 초는 무엇입니까?
Erik Rothoff

1
@brauliobo to_f밀리 초를 십진수로 포함 하므로 그렇지 않습니다 .
CashIsClay

20

를 사용하여 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 

-밀리 초 단위로만 반올림하는 경우에는 괜찮습니다.


18

조심하세요. 혼동하지 마세요. 루비가 소수의 초를 부동 소수점으로 지원한다는 사실은 실제로 부동 소수점 숫자가되지는 않습니다. 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
rplaurindo

13

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

Time.now.to_f * 1000

3
이 밀리 초 가짜
brauliobo

@brauliobo이 "가짜 밀리 초"는 어떻게됩니까? 시간을내어 코드를 실행하고 직접 확인 했습니까?
coisnepe

0

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.