【问题标题】:Ruby - What's the strftime equivalent of hhh:mm:ss?Ruby - 与 hhh:mm:ss 等效的 strftime 是什么?
【发布时间】:2015-06-12 21:15:02
【问题描述】:

我知道 hh:mm:ss 是 time_object.strftime('%H:%M:%S')。我使用这种格式的时间超过 24 小时,所以小时部分溢出。在 strftime 中获取 hhh:mm:ss 的正确方法是什么?

编辑:请求的示例。

会发生什么:

Time.at(90000).utc.strftime('%H:%M:%S')
=> "01:00:00"

Time.at(432000).utc.strftime('%H:%M:%S')
=> "00:00:00"

我想要发生的事情:

Time.at(90000).utc.something_else
=> "25:00:00"

Time.at(432000).utc.something_else
=> "120:00:00"

【问题讨论】:

  • 输入和预期输出是什么?
  • 请出示您的time_object
  • 我用一个例子更新了我的问题。

标签: ruby-on-rails ruby strftime


【解决方案1】:

Ruby 本身没有持续时间类,时间对象仅指定时间点。因此,Time#strftime 的小时数总是在0-23 范围内。持续时间以数字表示,1 为一秒;不用说,Float 没有strftime 方法。

如果您需要持续时间,您需要自己制作,或者使用已经为您制作的库(例如,duration)。

【讨论】:

    【解决方案2】:

    除了@Amadan 的解释,这里有一个简单的方法来计算您希望使用的时间字符串格式的时间偏移:

    require 'time'
    
    def new_time(basetime, offset)
      sign = (offset[0]=='-') ? - 1 : 1
      str = (sign==1) ? offset : offset[1..-1] 
      hrs, mins, secs = str.split(':').map(&:to_i)
      basetime + sign*(60*(60*hrs + mins) + secs)
    end  
    
    basetime = Time.parse('Apr 1, 2015') #=> 2015-04-01 00:00:00 -0700
    new_time(basetime,   "8:22:34")      #=> 2015-04-01 08:22:34 -0700 
    new_time(basetime,  "38:22:34")      #=> 2015-04-02 14:22:34 -0700 
    new_time(basetime, "138:22:34")      #=> 2015-04-06 18:22:34 -0700 
    new_time(basetime,  "-8:22:34")      #=> 2015-03-31 15:37:26 -0700 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 1970-01-01
      • 2019-06-26
      • 2011-03-11
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多