2013-06-24 28 views
7

Tôi đang cố gắng để ứng dụng của tôi hiển thị thời gian xuống đến mili giây (ví dụ: 11: 37: 53.231), nhưng strftime trong 1.8.7 dường như không có tùy chọn cho nó (http://ruby-doc.org/core-1.8.7/Time.html#method-i-strftime). Trong Ruby> = 1.9.3, có tùy chọn% 3N (http://ruby-doc.org/core-1.9.3/Time.html#method-i-strftime), nhưng không có trong tài liệu cho 1.8.7 và dường như không hoạt động.Hiển thị thời gian xuống đến mili giây trong Ruby 1.8.7

Đây là kết quả tôi nhận được trong Ruby 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" 

Có giải pháp thay thế nào không? Thật không may, chuyển sang 1.9.3 không phải là một tùy chọn.

Trả lời

7

Làm thế nào về một cái gì đó như thế này:

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

Sau đó

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

Câu trả lời này dường như đặt giây như một phần của mili giây. Một cái gì đó như '((time_diff - time_diff.to_i) * 1000.0) .to_i' bên trong công thức' to_milliseconds' sẽ giúp chỉ cung cấp mili giây ở cuối. – chech

+0

cho mili giây từ 0 đến 99, bạn cần phải thêm .to_s.rjust (3, '0') vào mã trước của tôi (không thể chỉnh sửa). – chech

+0

khỉ vá là xấu bro. – jahrichie

2

Dựa trên điều này: Một micro giây bằng đến 1000 nano giây hoặc 1/1.000 mili giây Bạn có thể nhận micro giây đầu tiên theo:

tv_usec => int 

Returns chỉ số micro giây cho thời gian.

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

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

t.usec    #=> 259970 

Và sau đó chia cho 1000

14

Tôi nghĩ rằng bạn có thể tìm kiếm "% L", mà sẽ cung cấp cho bạn mili giây bằng ba chữ số.

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

Tuy nhiên, tôi không chắc liệu điều này có được hỗ trợ trong các phiên bản cũ hơn của Ruby hay không.

+0

Đây phải là câu trả lời được chấp nhận. –

0

FWIW giải pháp của tôi để này là

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

Đó là một cách xấu xí để làm điều đó, vì như @Keane_zhou đã chỉ ra, bạn chỉ có thể sử dụng 'time.strftime ("% H:% M:% S. # {Time.usec/1000} ")'. – forcefsck

0

Một refactoring nhỏ để câu trả lời được cung cấp bởi NicoSantangelo:

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

Sau đó, bạn có thể sử dụng nó như thế này để tạo ra một đơn khiếu nại WS-an ninh timestamp:

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

Hoặc bạn có thể sử dụng khi cần thiết trong ví dụ của mình ...

Các vấn đề liên quan