2013-06-24 10 views
7

Próbuję poprosić moją aplikację o wyświetlenie czasu do milisekund (np. 11: 37: 53.231), ale strftime w wersji 1.8.7 nie wydaje się mieć opcja dla tego (http://ruby-doc.org/core-1.8.7/Time.html#method-i-strftime). W Ruby> = 1.9.3 dostępna jest opcja% 3N (http://ruby-doc.org/core-1.9.3/Time.html#method-i-strftime), ale nie ma jej w dokumentach dla wersji 1.8.7 i też nie działa.Czas wyświetlania do milisekund w języku Ruby 1.8.7

To jest wyjście, które dostaję w Rubim 1.8.7.

cur_time = Time.now 
# => Mon Jun 24 12:43:14 +0900 2013 
cur_time.strftime('%H:%M:%S.%3N') 
# => "12:43:14.%3N" 

Czy istnieje alternatywne rozwiązanie? Niestety przejście do wersji 1.9.3 nie jest opcją.

Odpowiedz

7

Jak o coś takiego:

class Time 
    def to_milliseconds 
    (self.to_f * 1000.0).to_i 
    end 
end 

Następnie

some_time = Time.now 
some_time.to_milliseconds # Time in milliseconds. It will be a big number 

some_time.strftime("%H:%M:%S.#{some_time.to_milliseconds % 1000}") # Same as some_time.strftime('%H:%M:%S.%3N') 
+0

Ta odpowiedź wydaje się również umieszczać sekundy jako część milisekund. Coś jak '((time_diff - time_diff.to_i) * 1000.0) .to_i' wewnątrz formuły' to_milliseconds' może pomóc w uzyskaniu tylko milisekund na końcu. – chech

+0

dla milisekund między 0 a 99, musisz dodać .to_s.rjust (3, '0') do mojego poprzedniego kodu (nie można edytować). – chech

+0

łatanie małpy jest złym bratem. – jahrichie

2

Na tej podstawie: mikrosekundy jest równa 1000 nanosekund lub 1/1000 milisekund Można dostać mikrosekundy najpierw przez:

tv_usec => int 

powrotów tylko liczby mikrosekund do czasu.

t = Time.now  #=> Wed Apr 09 08:56:04 CDT 2003 

"%10.6f" % t.to_f #=> "1049896564.259970" 

t.usec    #=> 259970 

a następnie podzielić przez 1000

14

myślę, że może być szukasz "% L", która da ci milisekundy w trzech cyfrach.

cur_time.strftime('%H:%M:%S.%L')  #=> "12:34:56.789" 

Jednak nie jestem pewien, czy jest to obsługiwane w starszych wersjach Rubiego.

+0

To powinna być zaakceptowana odpowiedź. –

0

FWIW moje rozwiązanie to było

time = Time.now #could be any time object 
ms = time.to_f.to_s.split(".").last[0..2] 
time.strftime("%H:%M:%S.#{ms}") 
+0

To brzydki sposób robienia tego, ponieważ jak zauważył @Keane_zhou, możesz po prostu użyć 'time.strftime ("% H:% M:% S. # {Time.usec/1000} ")'. – forcefsck

0

Mała refaktoryzacji do odpowiedzi udzielonej przez NicoSantangelo:

class Time 
    def to_millisecond 
    ((self.to_f * 1000.0).to_i) % 1000 
    end 
end 

Wtedy można go używać tak, aby wygenerować skargi WS-Security timestamp:

time = Time.now 
soap_timestamp = time.strftime("%FT%T.#{time.to_millisecond}Z") 

można go używać jako potrzebne w swoim przykładzie ...

Powiązane problemy