Ich habe das Gefühl, dass es einen einfachen / eingebauten Weg gibt, dies zu tun, aber ich kann ihn nicht finden.
Ich habe eine Dauer (in Sekunden) in einer Ganzzahl und möchte sie in einem benutzerfreundlichen Format anzeigen.
zB 3600 würde als "01:00:00" oder "1 Stunde" oder so angezeigt.
Ich kann es damit machen, time_ago_in_words(Time.zone.now+3600)
aber das fühlt sich wie ein Hack an. Es gibt keinen Grund, die aktuelle Zeit zu addieren / subtrahieren, nur um diesen Wert zu formatieren. Gibt es ein duration_in_words()
oder etwas?
Vielen Dank
ruby-on-rails
ruby
datetime
ruby-on-rails-3
Cydonia
quelle
quelle
distance_of_time_in_words
und Sie können die gerundete Zahl erhalten, indem Sievague: true
als Option übergeben.Zusammenfassen:
vorausgesetzt, dass
total_seconds = 3600
Option 1:
Option 2:
Option 3:
Verwendung Option1 , wenn Sie Wörter wollen, Option2 , wenn Sie H: M: S - Format, Option3 wenn Sie H: M: S - Format , und es kann mehr als 24 Stunden sein
quelle
01:00:00
.Rubys String-
%
Operator wird zu wenig geschätzt und oft vergessen.Wenn t eine Dauer in Sekunden ist, wird eine durch Nullen aufgefüllte, durch Doppelpunkte getrennte Zeichenfolge einschließlich Tagen ausgegeben. Beispiel:
Schön.
quelle
%
sagt: "Nehmen Sie das Array von Parametern von rechts und fügen Sie sie in die Formatzeichenfolge auf meiner linken Seite ein." Insofern ist es ähnlich wieprintf
in C \ C ++ nur prägnanter und kann in einer Zuordnung verwendet werden. Ja, das nenne ich schön. Und mächtig. Es gibt Beispiele, die diese Beredsamkeit besser demonstrieren würden, aber sie würden die Frage nicht beantworten. Ihr Snark wird übrigens nicht geschätzt.Ich denke du könntest auch so etwas machen wie:
So formatieren Sie es nach Ihren Wünschen.
Übrigens, ursprünglich habe ich daran gedacht, Time.at () zu verwenden, aber anscheinend ist die EPOCH-Zeit auf meinem Ubuntu Do 01. Januar 01:00:00 +0100 1970 und nicht 00:00:00 Stunden, wie ich erwartet hatte, und daher, wenn ich dies tue:
Gibt mir 1 Stunde mehr als gewünscht.
quelle
Ich benutze dies, um die Zeitdauer in meinem Rails-Projekt anzuzeigen:
Fügen Sie der
Integer
Klasse eine benutzerdefinierte Methode hinzu . Sie können eine neue Datei erstellen, diepretty_duration.rb
iminitializers
Ordner aufgerufen wird :Rufen Sie
seconds.pretty_duration
überall in Ihrem Projekt an:Diese Antwort baut auf Lev Lukomskys Code auf
quelle
Dieser verwendet die obskure
divmod
Methode, um gleichzeitig zu teilen und zu modulieren, sodassFloat
Sekunden richtig behandelt werden:quelle
Die Verwendung
Time.utc.strftime
funktioniert nur für Werte, wenn die Gesamtstundenzahl weniger als 24 beträgt :Bei höheren Werten werden falsche Ergebnisse zurückgegeben:
Ich schlage vor, die einfachste Methode zu verwenden, die ich für dieses Problem gefunden habe:
Sie können den zurückgegebenen Wert jederzeit an Ihre Bedürfnisse anpassen.
quelle
Seien Sie vorsichtig mit einer Dauer von mehr als einem Tag.
quelle
Eine Antwort, die von Lev Lukomskys Antwort inspiriert wurde, die ActiveSupport :: Duration nutzt und Millisekunden verarbeitet (nützlich für das Benchmarking von Code).
Natürlich können Sie dies problemlos mit Tagen, Monaten, Jahren usw. erweitern, indem Sie verwandte ActiveSupport-Methoden verwenden und dieselbe Struktur wiederholen.
Denken Sie daran, dass dies für zu lange Zeiträume möglicherweise ungenau ist, da die Dauer von 1 Monat nicht in Tagen festgelegt ist, und ich bin mir nicht sicher, wie AS: Duration damit umgeht.
quelle
Nur um meine 2 Cent einzubringen:
Gebaut aus Xiao Bins Antwort.
quelle
Shout out zu @joshuapinter , die die beste Antwort gab (in Form eines Kommentars ).
Verwenden Sie den Drop-In-Ersatz
dotiw
, um mehr Kontrolle über die Genauigkeit der Ausgabe zu erhalten, um den unterschiedlichen Anforderungen gerecht zu werden:https://github.com/radar/distance_of_time_in_words
Beispielansichtscode:
Das Ergebnis ist so etwas:
quelle
ActiveSupport::Duration.build
+inspect
gibt Ihnen gültige Ergebnissequelle
quelle