Ruby: Конвертировать время в секундах?
Как я могу преобразовать время, например, 10:30 в секунды? Есть ли какая-то встроенная функция Ruby для обработки этого?
В основном пытается определить количество секунд с полуночи (00:00) до определенного времени дня (например, 10:30 или 18:45).
Ответы
Ответ 1
Вы можете использовать DateTime#parse
, чтобы превратить строку в объект DateTime
, а затем умножить час на 3600 и минуту на 60, чтобы получить количество секунд:
require 'date'
# DateTime.parse throws ArgumentError if it can't parse the string
if dt = DateTime.parse("10:30") rescue false
seconds = dt.hour * 3600 + dt.min * 60 #=> 37800
end
Как отметил Джледев в комментариях, вы можете также использовать Time#seconds_since_midnight
, если у вас есть ActiveSupport:
require 'active_support'
Time.parse("10:30").seconds_since_midnight #=> 37800.0
Ответ 2
Встроенная библиотека time расширяет класс Time для анализа строк, поэтому вы можете использовать это. Они в конечном счете представлены в считанные секунды с эпохи UNIX, поэтому преобразование в целые числа и вычитание должно получить то, что вы хотите.
require 'time'
m = Time.parse('00:00')
t = Time.parse('10:30')
(t.to_i - m.to_i)
=> 37800
В ActiveSupport также есть немного сахара для обработки этих типов вещей.
Ответ 3
Еще одна реализация:
Time.now.to_i - Date.today.to_time.to_i # seconds since midnight
Ответ 4
Возможно, есть более сжатый способ, но:
t = Time.parse("18:35")
s = t.hour * 60 * 60 + t.min * 60 + t.sec
сделал бы трюк.
Ответ 5
require 'time'
def seconds_since_midnight(time)
Time.parse(time).hour * 3600 + Time.parse(time).min * 60 + Time.parse(time).sec
end
puts seconds_since_midnight("18:46")
Все отличные ответы, вот что я в итоге использовал.
Ответ 6
Вы можете просто использовать
Time.parse("10:30").seconds_since_midnight
Ответ 7
В обычном рубине самым быстрым является сумма временных частей:
require 'benchmark'
require 'time'
Benchmark.bm do |x|
x.report('date') { 100_000.times { Time.now.to_i - Date.today.to_time.to_i } }
x.report('parse') { 100_000.times { Time.now.to_i - Time.parse('00:00').to_i } }
x.report('sum') { 100_000.times { Time.now.hour * 3600 + Time.now.min * 60 + Time.now.sec } }
end
user system total real
date 0.820000 0.000000 0.820000 ( 0.822578)
parse 1.510000 0.000000 1.510000 ( 1.516117)
sum 0.270000 0.000000 0.270000 ( 0.268540)
Итак, вот метод, который учитывает часовой пояс, если необходимо
def seconds_since_midnight(time: Time.now, utc: true)
time = time.utc if utc
time.hour * 3600 + time.min * 60 + time.sec
end