Mam wrażenie, że jest na to prosty / wbudowany sposób, ale nie mogę go znaleźć.
Mam czas trwania (w sekundach) jako liczbę całkowitą i chcę wyświetlić go w przyjaznym formacie.
np. 3600 zostanie wyświetlone jako „01:00:00” lub „1 godzina” lub coś w tym rodzaju.
Mogę to zrobić, time_ago_in_words(Time.zone.now+3600)
ale wydaje mi się, że to trochę hack, nie ma powodu, aby dodawać / odejmować od bieżącego czasu tylko po to, aby sformatować tę wartość. Jest duration_in_words()
czy coś?
Dzięki
ruby-on-rails
ruby
datetime
ruby-on-rails-3
cydonia
źródło
źródło
distance_of_time_in_words
i można uzyskać zaokrąglony numer, przekazującvague: true
jako opcję.Podsumowując:
przy założeniu, że
total_seconds = 3600
Opcja 1:
Opcja 2:
Opcja 3:
użyj Opcji 1, jeśli chcesz słów, Opcji 2, jeśli chcesz format H: M: S, Opcji 3, jeśli chcesz formatu H: M: S i może to trwać dłużej niż 24 godziny
źródło
01:00:00
.%
Operator łańcuchowy Rubiego jest zbyt niedoceniany i często zapomniany.Biorąc pod uwagę, że t jest czasem trwania w sekundach, emitowany jest ciąg znaków rozdzielonych dwukropkami z zerami, w tym dni. Przykład:
Śliczny.
źródło
%
Mówi, „Take szereg parametrów z mojej prawej i wstawić je w ciągu formatu na mojej lewej stronie.” Pod tym względem jest podobny doprintf
C \ C ++, tylko bardziej zwięzły i może być używany w przypisaniu. Tak, nazywam to cudownym. I potężny. Są przykłady, które lepiej zademonstrowałyby tę elokwencję, ale nie odpowiedziałyby na pytanie. Twój snark nie jest doceniany, przy okazji.Myślę, że możesz też zrobić coś takiego:
Aby sformatować to, jak chcesz.
BTW, początkowo myślałem o użyciu Time.at (), ale wydaje się, że czas EPOCH na moim Ubuntu to Thu Jan 01 01:00:00 +0100 1970, a nie 00:00:00, jak się spodziewałem, a zatem jeśli to zrobię:
Daje mi 1 godzinę więcej niż chciałem.
źródło
Używam tego, aby pokazać czasy trwania w moim projekcie Rails:
Dodaj metodę niestandardową do
Integer
klasy. Możesz utworzyć nowy plik o nazwiepretty_duration.rb
winitializers
folderze:Zadzwoń do
seconds.pretty_duration
dowolnego miejsca w projekcie:Ta odpowiedź opiera się na Kodeksie Lwa Łukomskiego
źródło
Ten używa niejasnej
divmod
metody dzielenia i modulo w tym samym czasie, więcFloat
poprawnie obsługuje sekundy:źródło
Użycie
Time.utc.strftime
działa tylko w przypadku wartości, których łączna liczba godzin jest mniejsza niż 24 :W przypadku większych wartości zwraca nieprawidłowe wyniki:
Proponuję użyć najprostszej metody, którą znalazłem dla tego problemu:
Zawsze możesz dostosować zwracaną wartość do swoich potrzeb.
źródło
Uważaj na czas trwania dłuższy niż jeden dzień.
źródło
Odpowiedź zainspirowana odpowiedzią Lwa Lukomsky'ego wykorzystującą ActiveSupport :: Duration i obsługę milisekund (przydatne w kodzie porównawczym)
Oczywiście możesz to łatwo przedłużyć o dni, miesiące, lata itp., Używając powiązanych metod ActiveSupport i powtarzając tę samą strukturę.
Pamiętaj, że w przypadku zbyt długich okresów może to być niedokładne, ponieważ czas trwania 1 miesiąca nie jest określony liczbą dni i nie jestem pewien, jak radzi sobie z tym AS: Duration.
źródło
Wystarczy dorzucić moje 2 centy:
Zbudowany z odpowiedzi Xiao Bin.
źródło
Krzycz do @joshuapinter, który udzielił najlepszej odpowiedzi (w formie komentarza ).
Użyj
dotiw
klejnotu zastępczego, aby uzyskać większą kontrolę nad dokładnością wyjścia w zależności od różnych potrzeb:https://github.com/radar/distance_of_time_in_words
Przykładowy kod widoku:
W wyniku czegoś takiego:
źródło
ActiveSupport::Duration.build
+inspect
daje prawidłowe wynikiźródło
źródło