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

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

7
задан Simone Carletti 28 August 2015 в 09:45
поделиться

2 ответа

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

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"
8
ответ дан 6 December 2019 в 23:04
поделиться

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

3
ответ дан 6 December 2019 в 23:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: