У меня есть ощущение, что есть простой / встроенный способ сделать это, но я не могу его найти.
У меня есть целое число (в секундах), и я хочу отобразить его в удобном формате.
например, 3600 будет отображаться как «01:00:00» или «1 час» или что-то в этом роде.
Я могу это сделать, time_ago_in_words(Time.zone.now+3600)
но это похоже на взлом, нет причин добавлять / вычитать из текущего времени только для форматирования этого значения. Есть что- duration_in_words()
нибудь?
Спасибо
ruby-on-rails
ruby
datetime
ruby-on-rails-3
Сидонии
источник
источник
distance_of_time_in_words
и вы можете получить округленное число, передавvague: true
как опцию.Подводя итоги:
при условии, что
total_seconds = 3600
Опция 1:
Вариант 2:
Вариант 3:
используйте Option1, если вам нужны слова, Option2, если вы хотите формат H: M: S, Option3, если вы хотите формат H: M: S, и может быть более 24 часов
источник
01:00:00
.Строковый
%
оператор Ruby слишком недооценен и часто забывается.Учитывая, что t - это продолжительность в секундах, это выдает строку с разделителями-двоеточиями, дополненную нулями, включая дни. Пример:
Прекрасный.
источник
%
говорит: «Возьмите массив параметров справа и вставьте их в строку формата слева от меня». В этом отношении он похож наprintf
C \ C ++, только более краток и может использоваться в назначении. Да, я называю это прекрасным. И мощный. Есть примеры, которые лучше демонстрируют это красноречие, но они не дают ответа на вопрос. Между прочим, твои язвы не оценены.Я думаю, вы могли бы сделать что-то вроде:
Отформатировать как хотите.
Кстати, изначально я думал об использовании Time.at (), но кажется, что время EPOCH на моем Ubuntu - четверг 01 января 01:00:00 +0100 1970, а не 00:00:00 часов, как я ожидал, и поэтому, если я это сделаю:
Дает мне на 1 час больше, чем хотелось.
источник
Я использую это, чтобы показать продолжительность времени в моем проекте Rails:
Добавьте в
Integer
класс собственный метод . Вы можете создать новый файл с именемpretty_duration.rb
вinitializers
папке:Звоните в
seconds.pretty_duration
любую точку вашего проекта:Этот ответ основан на Кодексе Льва Лукомского.
источник
Этот использует неясный
divmod
метод для одновременного деления и по модулю, поэтому онFloat
правильно обрабатывает секунды:источник
Использование
Time.utc.strftime
работает только для значений, когда общее количество часов меньше 24 :Для больших значений возвращает неверные результаты:
Я предлагаю использовать самый простой способ, который я нашел для этой проблемы:
Вы всегда можете настроить возвращаемое значение в соответствии с вашими потребностями.
источник
Будьте осторожны с продолжительностью более одного дня.
источник
Ответ, вдохновленный тем, что Лев Лукомский использует ActiveSupport :: Duration и обрабатывает миллисекунды (полезно для тестирования кода)
Конечно, вы можете легко увеличить это количество дней, месяцев, лет и т. Д., Используя соответствующие методы ActiveSupport и повторяя ту же структуру.
Имейте в виду, что для слишком большой продолжительности это может быть неточно, поскольку продолжительность 1 месяца не фиксируется в количестве дней, и я не уверен, как с этим справляется AS: Duration.
источник
Просто чтобы добавить свои 2 цента:
Построен на основе ответа Сяо Биня.
источник
Выкрикните к @joshuapinter который дал лучший ответ (в виде комментария ).
Используйте заменяющий
dotiw
драгоценный камень, чтобы получить больший контроль над точностью вывода в соответствии с различными потребностями:https://github.com/radar/distance_of_time_in_words
Пример кода просмотра:
В результате получается что-то вроде этого:
источник
ActiveSupport::Duration.build
+inspect
дает вам достоверные результатыисточник
источник