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