Ruby时间减法

3
有一个任务:我需要获取两个时间之间的分钟数,例如在“8:15”和“7:45”之间。我有以下代码:
(Time.parse("8:15") - Time.parse("7:45")).minute

但是我得到的结果是"108000.0秒"。

我该如何解决?

3个回答

5

你得到的结果是秒数的浮点数,而不是时间对象。因此,要获取两个时间之间的分钟数和秒数:

require 'time'
t1 = Time.parse("8:15")
t2 = Time.parse("7:45")
total_seconds = (t1 - t2) # => 1800.0

minutes = (total_seconds / 60).floor # => 30
seconds = total_seconds.to_i % 60 # => 0

puts "difference is #{minutes} minute(s) and #{seconds} second(s)"

使用 floor 和取模运算符 (%) 可以将分钟和秒数拆分,使其更人性化可读,而不是只显示"6.57分钟"。

2
你可以通过对小时和分钟进行数学运算而不是将它们解析为Time对象来避免奇怪的时间解析陷阱(夏令时、在午夜左右运行代码)。大致如下(我会通过测试验证数学公式):
one = "8:15"
two = "7:45"
h1, m1 = one.split(":").map(&:to_i)
h2, m2 = two.split(":").map(&:to_i)
puts (h1 - h2) * 60 + m1 - m2

如果您确实想考虑夏令时(例如有时想根据今天的日期添加或减少一小时),那么您当然需要涉及时间(Time)


1
时间相减的结果以秒为单位返回。因此,将其除以60以获得以分钟为单位的答案:
=> (Time.parse("8:15") - Time.parse("7:45")) / 60
#> 30.0

1
作为一个时间代码偏执狂,这里有一些需要注意的问题:这段代码不能跨越一天的边界,例如00:01-23:59。如果代码在午夜运行,它可能会在星期一的最后一毫秒解析第一次时间,在星期二的第一毫秒解析第二次时间,因此可能会失败。在夏令时更改的那些日子里,它可能会展现出一些奇怪的行为。 - Henrik N

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接