gpt4 book ai didi

ruby - 如何将持续时间(以毫秒为单位)显示为格式正确的字符串?

转载 作者:太空宇宙 更新时间:2023-11-03 16:42:18 26 4
gpt4 key购买 nike

我正在使用 Ruby 2.4。我想将毫秒转换为可读的小时、分钟和秒格式。所以我有这个方法

  def time_as_str(time_in_ms)
regex = /^(0*:?)*0*/
Time.at(time_in_ms.to_f/1000).utc.strftime("%H:%M:%S.%1N").sub!(regex, '')
end

问题是,如果我的毫秒值是一天或更长,这个函数不会显示正确的值。例如,如果我通过了

2.4.0 :009 > TimeFormattingHelper.time_as_str(86400000)
=> ".0"

86400000 是以毫秒为单位的一天(除非我计算错误)。所以我希望该值为“24:00:00”。如何更正上述内容以正确显示时间格式?

最佳答案

def time_as_str(ms)
secs, ms = 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

time_as_str(86_400_000) #=> "24.0.0.0"
time_as_str(0) #=> "0.0"
time_as_str(499) #=> "0.499"
time_as_str(60_280) #=> "1.0.28"
time_as_str(360_000) #=> "6.0.0"
time_as_str(1_000_000_200) #=> "277.46.40.2"

参见 Integer#divmod ,一种经常被忽视的方法。

假设

ms = 2_045_670

然后

secs, ms    =   ms.divmod(1000)
#=> [2045, 670] (secs #=> 2045, ms #=> 670)
mins, secs = secs.divmod(60)
#=> [34, 5]
hours, mins = mins.divmod(60)
#=> [0, 34]
ms = ms.zero? ? "0" : ms.to_s.sub(/0*\z/,'')
#=> "67" (truncate)
s = "%d.%d.%d.%s" % [hours, mins, secs, ms]
#=> "0.34.5.67"
if hours > 0 # false
"0.34.5.67"
elsif mins > 0 # true
"34.5.67"
else # not evaluated
"5.67"
end
#=> "34.5.67"

关于ruby - 如何将持续时间(以毫秒为单位)显示为格式正确的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43460267/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com