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_wordsy puede obtener el número redondeado pasandovague: truecomo una opción.Resumiendo:
asumiendo que
total_seconds = 3600Opció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 aprintfen 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
Integerclase. Puede crear un nuevo archivo llamadopretty_duration.rben lainitializerscarpeta:Llame a
seconds.pretty_durationcualquier lugar de su proyecto:Esta respuesta se basa en el Código de Lev Lukomsky
fuente
Este usa el
divmodmétodo oscuro para dividir y módulo al mismo tiempo, por lo que maneja losFloatsegundos correctamente:fuente
El uso
Time.utc.strftimefunciona 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
dotiwgema 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+inspectte da resultados válidosfuente
fuente