如何格式化持续时间字符串以在零字段中包含两个零?

How do I format a duration string to include two zeroes for a zero field?

使用 Rails 5.0.1 和 Ruby 2.4。我有一种方法可以将持续时间(以毫秒为单位)显示为格式化字符串。

def time_as_str(time_in_ms)
  secs, ms    =   time_in_ms.divmod(1000)
  mins, secs  = secs.divmod(60)
  hours, mins = mins.divmod(60)
  s = "%d:%d:%d.%s" % [hours, mins, secs, ms.zero? ? "0" : ms.to_s.sub(/0*\z/,'')]
  if hours > 0
    s
  elsif mins > 0
    s[2..-1]
  else
    s[4..-1]
  end
end

不过我遇到了一点麻烦,因为如果分钟或秒字段为零,输出将显示为“0”而不是“00”。例如,如果我用

调用函数
86400000

(即24小时的毫秒数),输出为

"24:0:0.0"

但我希望它是

"24:00:00"

同样如果输入是

1000

输出应该是

"1"

因为一千毫秒等于一秒。如有必要,如何正确格式化我的输出以包含两个零?

您可以按如下方式使用:

def time_as_str(time_in_ms)
  secs, ms    =   time_in_ms.divmod(1000)
  mins, secs  = secs.divmod(60)
  hours, mins = mins.divmod(60)
  s = "%d:%02d:%02d%s" % [hours, mins, secs, ms.zero? ? "" : "."+ms.to_s.sub(/0*\z/,'')]
  (hours > 0 ? s : mins > 0 ? s[2..-1] : s[5..-1]).sub(/^0/,"")
end

基本上 % 将插入您传递的任何内容,%d 表示打印为数字,%02d 打印为占用至少 2 位数字的数字,在左侧填充 0 直到至少出现 2 位数字.然后你会想要 %s 在没有 msms=0 的情况下实际打印一个空字符串,如果没有打印 ms 的字符串,左边有一个点。

我认为你应该决定 ms 在 format/interpolate 字符串之前保留什么,这样你就不需要在 format 数组中调用三元运算符。