En Ruby llano el más rápido es la suma de las partes de la hora:
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)
Por lo tanto, aquí hay una método que tiene en cuenta la zona horaria, si es necesario
def seconds_since_midnight(time: Time.now, utc: true)
time = time.utc if utc
time.hour * 3600 + time.min * 60 + time.sec
end
Esto parece requerir soporte activo. –
Además, hay un método 'seconds_since_midnight'. –
En cuanto a ArgumentError ... ¿hay alguna manera de convertir un número al tiempo? Entonces, digamos que la entrada fue solo "8" ... Me gustaría convertir a "8:00" – Shpigford