【发布时间】:2017-09-13 14:09:30
【问题描述】:
我使用的是 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”。如何更正上述内容以正确显示时间格式?
【问题讨论】:
-
你的正则表达式搞砸了。即使它消失了,这也不会达到您的预期。
Time.at(86400000.to_f/1000) => 1970-01-01 18:00:00 -0600。您正在获取日期的小时数...Time.at(86400000.to_f/1000).strftime("%H:%M:%S.%1N") => "18:00:00.0"ruby-doc.org/core-2.3.0/Time.html#method-c-at -
此外,当您尝试解决此类问题时,将其分解为多个步骤会有所帮助,每个步骤都足够简单,可以轻松确定成功。您的最后一行有不少于 6 个单独的操作,每一个都导致难以确定所有这些错误的确切位置......
-
阅读 Jon Skeet 的“Writing the perfect question”
-
"24:00:00"是一个无效时间,不是吗?您的方法返回一个Time对象,因此应该只返回有效时间,即在"00:00:00"和"23:59:59"之间。除非您尝试将毫秒转换为小时、分钟和秒,这与将有效时间(以毫秒为单位)转换为 hh:mm:ss 不同。