Tengo la sensación de que hay una forma simple / incorporada de hacer esto, pero no puedo encontrarla.
Tengo una duración (en segundos) en un número entero y quiero mostrarla en un formato amigable.
por ejemplo, 3600 se mostraría como "01:00:00" o "1 hora" o algo así.
Puedo hacerlo con, time_ago_in_words(Time.zone.now+3600)
pero se siente como un truco, no hay razón para sumar / restar de la hora actual solo para formatear este valor. ¿Hay duration_in_words()
algo o algo?
Gracias
ruby-on-rails
ruby
datetime
ruby-on-rails-3
Cydonia
fuente
fuente
distance_of_time_in_words
y puede obtener el número redondeado pasandovague: true
como una opción.Resumiendo:
asumiendo que
total_seconds = 3600
Opción 1:
Opcion 2:
Opcion 3:
use Option1 si quiere palabras, Option2 si quiere formato H: M: S, Option3 si quiere formato H: M: S y puede haber más de 24 horas
fuente
01:00:00
.El
%
operador de cuerda de Ruby es demasiado poco apreciado y a menudo olvidado.Dado que t es una duración en segundos, esto emite una cadena separada por dos puntos con relleno de ceros que incluye días. Ejemplo:
Encantador.
fuente
%
dice: "Tome la matriz de parámetros de mi derecha e insértelos en la cadena de formato de mi izquierda". En ese sentido, es similar aprintf
en C \ C ++ solo que más conciso y puede usarse en una tarea. Sí, a eso lo llamo encantador. Y poderoso. Hay ejemplos que demostrarían mejor esta elocuencia, pero no responderían a la pregunta. Tu snark no es apreciado, por cierto.Supongo que también podrías hacer algo como:
Para formatearlo como desee.
Por cierto, originalmente pensé en usar Time.at () pero parece que la hora de EPOCH en mi Ubuntu es Thu Jan 01 01:00:00 +0100 1970 y no 00:00:00 horas como esperaba, y por lo tanto si lo hago:
Me da 1 hora más de la deseada.
fuente
Utilizo esto para mostrar las duraciones de tiempo en mi proyecto Rails:
Agrega un método personalizado a la
Integer
clase. Puede crear un nuevo archivo llamadopretty_duration.rb
en lainitializers
carpeta:Llame a
seconds.pretty_duration
cualquier lugar de su proyecto:Esta respuesta se basa en el Código de Lev Lukomsky
fuente
Este usa el
divmod
método oscuro para dividir y módulo al mismo tiempo, por lo que maneja losFloat
segundos correctamente:fuente
El uso
Time.utc.strftime
funciona solo para valores cuando el número total de horas es menor que 24 :Para valores mayores, devuelve resultados incorrectos:
Sugiero usar el método más simple que encontré para este problema:
Siempre puede ajustar el valor devuelto a sus necesidades.
fuente
Tenga cuidado con la duración superior a un día.
fuente
Una respuesta inspirada en la de Lev Lukomsky que aprovecha ActiveSupport :: Duration y maneja milisegundos (útil para comparar el código)
Por supuesto, puede extender esto fácilmente con días, meses, años, etc. utilizando métodos relacionados de ActiveSupport y repitiendo la misma estructura.
Tenga en cuenta que para duraciones demasiado largas, esto puede ser inexacto, ya que la duración de 1 mes no se fija en el número de días, y no estoy seguro de cómo AS: Duration trata eso.
fuente
Solo para tirar mis 2 centavos:
Basado en la respuesta de Xiao Bin.
fuente
Grita a @joshuapinter quién dio la mejor respuesta (en forma de comentario ).
Utilice el reemplazo directo
dotiw
gema de para obtener más control sobre la precisión de la salida para satisfacer diferentes necesidades:https://github.com/radar/distance_of_time_in_words
Código de vista de muestra:
Dando como resultado algo como esto:
fuente
ActiveSupport::Duration.build
+inspect
te da resultados válidosfuente
fuente