【问题标题】:Display time down to milliseconds in Ruby 1.8.7在 Ruby 1.8.7 中显示时间降至毫秒
【发布时间】:2013-06-20 12:21:16
【问题描述】:

我试图让我的应用程序将时间显示为毫秒(例如 11:37:53.231),但 1.8.7 中的 strftime 似乎没有选项(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。

【问题讨论】:

    标签: ruby time


    【解决方案1】:

    基于此: 一微秒等于 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

    【讨论】:

      【解决方案2】:

      这样的事情怎么样:

      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')
      

      【讨论】:

      • 这个答案似乎也将秒数作为毫秒的一部分。 to_milliseconds 公式中的 ((time_diff - time_diff.to_i) * 1000.0).to_i 之类的内容将有助于仅提供最后的毫秒数。
      • 0 到 99 之间的毫秒,你需要在我之前的代码中添加 .to_s.rjust(3, '0') (无法编辑)。
      • 猴子补丁是坏兄弟。
      • @jahrichie 是的,这通常是个坏主意,但你没有猴子补丁Time,你可以轻松地将方法添加到你自己的类中。这只是一个例子:)
      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        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}")
        

        【讨论】:

        • 这是一种丑陋的做法,因为正如@Keane_zhou 所指出的,您可以简单地使用time.strftime("%H:%M:%S.#{time.usec/1000}")
        【解决方案5】:

        对 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")
        

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

        【讨论】:

          猜你喜欢
          • 2015-09-22
          • 1970-01-01
          • 1970-01-01
          • 2019-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-06
          • 2020-03-18
          相关资源
          最近更新 更多