Я задавался вопросом, существует ли встроенный метод в Ruby, который позволяет мне преобразовывать времена полировки в формате hh:mm:ss.sss к миллисекундам и наоборот. Так как я должен сделать некоторые вычисления с ним, я предположил, что преобразование в миллисекунды будет самым легким способом сделать это. Скажите мне, если я неправ здесь :)
Как насчет этого?
a=[1, 1000, 60000, 3600000]*2
ms="01:45:36.180".split(/[:\.]/).map{|time| time.to_i*a.pop}.inject(&:+)
# => 6336180
t = "%02d" % (ms / a[3]).to_s << ":" <<
"%02d" % (ms % a[3] / a[2]).to_s << ":" <<
"%02d" % (ms % a[2] / a[1]).to_s << "." <<
"%03d" % (ms % a[1]).to_s
# => "01:45:36.180"
Поскольку вы полностью игнорируете дату и, возможно, имеете числа больше 24 в качестве количества часов, возможно, существующие классы Ruby вам не подходят (в минимум из стандартной библиотеки).
На самом деле, есть пара методов, которые могут быть полезны: time_to_day_fraction и day_fraction_to_time , но по какой-то причине они являются частными (по крайней мере, в 1.9.1).
Таким образом, вы можете либо обезьяно исправить их, чтобы сделать их общедоступными, либо просто скопируйте и вставьте их реализацию в свой код:
def time_to_day_fraction(h, min, s)
Rational(h * 3600 + min * 60 + s, 86400) # 4p
end
def day_fraction_to_time(fr)
ss, fr = fr.divmod(Rational(1, 86400)) # 4p
h, ss = ss.divmod(3600)
min, s = ss.divmod(60)
return h, min, s, fr
end
Они работают с классом Rational
, поэтому вы можете легко вычислить с ними .