strf rails hora año actual ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 ruby-2.0

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.




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"