J'ai le sentiment qu'il existe un moyen simple / intégré de le faire, mais je ne le trouve pas.
J'ai une durée (en secondes) sous forme de nombre entier et je souhaite l'afficher dans un format convivial.
par exemple, 3600 serait affiché comme "01:00:00" ou "1 heure" ou quelque chose.
Je peux le faire avec time_ago_in_words(Time.zone.now+3600)
mais cela ressemble un peu à un hack, il n'y a aucune raison d'ajouter / de soustraire de l'heure actuelle juste pour formater cette valeur. Y a-t-il un duration_in_words()
ou quelque chose?
Merci
distance_of_time_in_words
et vous pouvez obtenir le nombre arrondi en le passantvague: true
en option.En résumé:
en admettant que
total_seconds = 3600
Option 1:
Option 2:
Option 3:
utilisez Option1 si vous voulez des mots, Option2 si vous voulez le format H: M: S, Option3 si vous voulez le format H: M: S et il peut y avoir plus de 24 heures
la source
01:00:00
.L'
%
opérateur de chaîne de Ruby est trop méconnu et souvent oublié.Étant donné que t est une durée en secondes, cela émet une chaîne de caractères séparés par deux-points, complétée par zéro, y compris les jours. Exemple:
Charmant.
la source
%
dit: "Prenez le tableau de paramètres à ma droite et insérez-les dans la chaîne de format à ma gauche." À cet égard, il est similaire àprintf
C \ C ++ mais plus concis et peut être utilisé dans une affectation. Oui, j'appelle ça charmant. Et puissant. Il existe des exemples qui démontreraient mieux cette éloquence, mais ils ne répondraient pas à la question. Votre snark n'est pas apprécié, d'ailleurs.Je suppose que vous pourriez aussi faire quelque chose comme:
Pour le formater comme vous le souhaitez.
BTW, à l'origine, j'ai pensé à utiliser Time.at () mais il semble que l'heure EPOCH sur mon Ubuntu est Thu Jan 01 01:00:00 +0100 1970 et non 00:00:00 heures comme je m'y attendais, et donc si je le fais:
Me donne 1 heure de plus que ce que je voulais.
la source
J'utilise ceci pour afficher les durées de temps dans mon projet Rails:
Ajoutez une méthode personnalisée à la
Integer
classe. Vous pouvez créer un nouveau fichier appelépretty_duration.rb
dans leinitializers
dossier:Appelez
seconds.pretty_duration
n'importe où dans votre projet:Cette réponse s'appuie sur le code de Lev Lukomsky
la source
Celui-ci utilise la
divmod
méthode obscure pour diviser et modulo en même temps, donc il gèreFloat
correctement les secondes:la source
L'utilisation
Time.utc.strftime
ne fonctionne que pour les valeurs lorsque le nombre total d'heures est inférieur à 24 :Pour des valeurs supérieures, il renvoie des résultats incorrects:
Je suggère d'utiliser la méthode la plus simple que j'ai trouvée pour ce problème:
Vous pouvez toujours ajuster la valeur renvoyée à vos besoins.
la source
Soyez prudent avec la durée supérieure à un jour.
la source
Une réponse inspirée de celle de Lev Lukomsky tirant parti d'ActiveSupport :: Duration, et de la gestion des millisecondes (utile pour comparer le code)
Bien sûr, vous pouvez facilement prolonger cela avec des jours, des mois, des années, etc. en utilisant les méthodes ActiveSupport associées et en répétant la même structure.
Gardez à l'esprit que pour des durées trop longues, cela peut être inexact car la durée d'un mois n'est pas fixée en nombre de jours, et je ne sais pas comment AS: Duration gère cela.
la source
Juste pour jeter mes 2 cents:
Construit à partir de la réponse de Xiao Bin.
la source
Criez à @joshuapinter qui a donné la meilleure réponse (sous la forme d' un commentaire ).
Utilisez la
dotiw
gemme de remplacement pour mieux contrôler la précision de la sortie afin de répondre à différents besoins:https://github.com/radar/distance_of_time_in_words
Exemple de code de vue:
Résultat de quelque chose comme ceci:
la source
ActiveSupport::Duration.build
+inspect
vous donne des résultats validesla source
la source