13

我试图让我的应用程序将时间显示到毫秒(例如 11:37:53.231),但strftime在 1.8.7 中似乎没有它的选项(http://ruby-doc.org/ core-1.8.7/Time.html#method-i-strftime)。在 Ruby >= 1.9.3 中,有 %3N 选项(http://ruby-doc.org/core-1.9.3/Time.html#method-i-strftime),但它不在 1.8 的文档中。 7,好像也没用。

这是我在 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"

有替代解决方案吗?不幸的是,迁移到 1.9.3 不是一个选择。

4

5 回答 5

33

我想你可能正在寻找“%L”,它会给你三位数的毫秒数。

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

但是,我不确定旧版本的 Ruby 是否支持此功能。

于 2014-11-25T12:54:41.260 回答
10

像这样的东西怎么样:

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

然后

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')
于 2013-06-24T04:40:49.900 回答
2

基于此:一微秒等于 1000 纳秒或 1/1,000 毫秒您可以先通过以下方式获得微秒:

tv_usec => int

仅返回时间的微秒数。

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

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

t.usec              #=> 259970

然后除以 1000

于 2013-06-24T04:26:48.600 回答
0

FWIW我对此的解决方案是

time = Time.now #could be any time object
ms = time.to_f.to_s.split(".").last[0..2]
time.strftime("%H:%M:%S.#{ms}")
于 2015-02-06T15:06:09.517 回答
0

对 NicoSantangelo 提供的答案的一个小重构:

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

然后您可以像这样使用它来生成 WS-security 投诉时间戳:

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

或者您可以在示例中根据需要使用它...

于 2016-04-22T15:10:08.740 回答