2010-09-29 22 views
15

¿Cómo puedo convertir un tiempo como 10:30 en segundos? ¿Hay algún tipo de función Ruby incorporada para manejar eso?Ruby: convertir el tiempo a segundos?

Básicamente tratando de calcular el número de segundos desde la medianoche (00:00) hasta una hora específica del día (como 10:30 o 18:45).

Respuesta

26

Puede utilizar DateTime#parse para convertir una cadena en un objeto DateTime, y luego multiplicar la hora en 3600 y la hora por 60 para obtener el número de segundos:

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 

Como jleedev señaló en los comentarios , también se puede utilizar Time#seconds_since_midnight si tiene ActiveSupport:

require 'active_support' 
Time.parse("10:30").seconds_since_midnight #=> 37800.0 
+0

Esto parece requerir soporte activo. –

+4

Además, hay un método 'seconds_since_midnight'. –

+0

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

3

Tal vez hay una manera más sucinta, pero:

t = Time.parse("18:35") 
s = t.hour * 60 * 60 + t.min * 60 + t.sec 

haría el truco.

8

La biblioteca incorporada time amplía la clase de tiempo para analizar las cadenas, por lo que podría usar eso. En última instancia, se representan como segundos desde la época de UNIX, por lo que la conversión a enteros y sustracción debería proporcionarle lo que desea.

require 'time' 
m = Time.parse('00:00') 
t = Time.parse('10:30') 

(t.to_i - m.to_i) 
=> 37800 

También hay algo de azúcar en ActiveSupport para manejar este tipo de cosas.

+0

Nota. cuando se aplica en un objeto DateTime, esto devolverá una cadena con la fecha actual, lo que puede o no puede confundir si se realizan cálculos que coinciden con la medianoche. – Jerome

1
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") 

Todas las respuestas excelentes, esto es lo que terminé usando.

7

Sin embargo, otra aplicación:

Time.now.to_i - Date.today.to_time.to_i # seconds since midnight 
1

puede simplemente usar

Time.parse("10:30").seconds_since_midnight 
0

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 
Cuestiones relacionadas