Преобразование длительностей в Ruby-hh: mm: ss.sss в миллисекунды и наоборот

Мне было интересно, есть ли встроенный метод в Ruby, который позволяет мне конвертировать время круга в формате hh:mm:ss.sss до миллисекунд и наоборот. Поскольку мне нужно сделать с ним некоторые вычисления, я предположил, что преобразование в миллисекунды будет самым простым способом сделать это. Скажи мне, если я ошибаюсь :)

3 ответов


Как насчет этого?

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 не подходят для вас (по крайней мере, из стандартного lib).

на самом деле, есть несколько методов, которые могут быть полезны: 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 класс, так что вы можете легко вычислить с ними.


преобразование секунд в HH: MM: SS в Ruby

t = 323 # seconds
Time.at(t).utc.strftime("%H:%M:%S")
=> "00:03:56"