ruby-on-rails - hora - strftime rails activerecord
Rieles-Obtener la diferencia de tiempo en horas, minutos y segundos (4)
Estoy buscando una forma idiomática de pasar el tiempo desde una fecha determinada en horas, minutos y segundos.
Si la fecha dada es 2013-10-25 23:55:00 y la fecha actual es 2013-10-27 20:55:09, el valor de retorno debe ser 45:03:09. Las gemas time_difference y time_diff no funcionarán con este requisito.
Hay un método para eso:
Time.now.minus_with_coercion(10.seconds.ago)
es igual a 10 (de hecho, 9.99 ..., usa .round
si quieres un 10).
Fuente: http://apidock.com/rails/Time/minus_with_coercion
Espero haberte ayudado.
Mirar
¿Cómo convertir 270921sec en días + horas + minutos + sec? (rubí)
que es muy similar a tu pregunta, solo comenzando desde la diferencia en segundos
Puedes probar con esto:
def time_diff(start_time, end_time)
seconds_diff = (start_time - end_time).to_i.abs
hours = seconds_diff / 3600
seconds_diff -= hours * 3600
minutes = seconds_diff / 60
seconds_diff -= minutes * 60
seconds = seconds_diff
"#{hours.to_s.rjust(2, ''0'')}:#{minutes.to_s.rjust(2, ''0'')}:#{seconds.to_s.rjust(2, ''0'')}"
# or, as hagello suggested in the comments:
# ''%02d:%02d:%02d'' % [hours, minutes, seconds]
end
Y úsalo:
time_diff(Time.now, Time.now-2.days-3.hours-4.minutes-5.seconds)
# => "51:04:04"
time_diff = Time.now - 2.minutes.ago
Time.at(time_diff.to_i.abs).utc.strftime "%H:%M:%S"
=> "00:01:59"
O si su aplicación es delicada para redondear, simplemente reemplace to_i para redondear:
Time.at(time_diff.round.abs).utc.strftime "%H:%M:%S"
=> => "00:02:00"
Aunque no estoy seguro de la parte idiomática
Actualización: si se espera que la diferencia de tiempo sea más de 24 horas, entonces el código anterior no es correcto. Si ese es el caso, uno podría seguir la respuesta de @MrYoshiji o ajustar la solución anterior para calcular las horas manualmente desde un objeto de fecha y hora:
def test_time time_diff
time_diff = time_diff.round.abs
hours = time_diff / 3600
dt = DateTime.strptime(time_diff.to_s, ''%s'').utc
"#{hours}:#{dt.strftime "%M:%S"}"
end
test_time Time.now - 28.hours.ago - 2.minutes - 12.seconds
=> "27:57:48"
test_time Time.now - 8.hours.ago - 2.minutes - 12.seconds
=> "7:57:48"
test_time Time.now - 24.hours.ago - 2.minutes - 12.seconds
=> "23:57:48"
test_time Time.now - 25.hours.ago - 2.minutes - 12.seconds
=> "24:57:48"