Как вы делаете относительное время в Rails?

Я пишу приложение Rails, но не могу найти, как делать относительное время, т.е. если задан определенный класс Time, он может вычислить «30 секунд назад» или «2 дня назад», или если это больше месяца «01.09.2008» и др.

"вычислить" кажется неправильным словом, вы имели в виду "вывод"?

lulalala 25.11.2011 10:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
221
1
127 856
11

Ответы 11

Вы можете использовать арифметические операторы для определения относительного времени.

Time.now - 2.days 

Отдам 2 дня назад.

Знаете ли вы о 2.days.ago?

webmat 13.10.2008 17:36

есть ли метод сокращения для Time.now + 2.days?

Stefan 28.03.2011 14:52

@NixNinja: 2.days.since или 2.days.from_now

Brian Donovan 03.06.2011 22:06

это назад от того, что задавал вопрос. time_ago_in_words - это ответ на вопрос.

xaxxon 15.10.2011 11:00

Что-то вроде этого сработает.

def relative_time(start_time)
  diff_seconds = Time.now - start_time
  case diff_seconds
    when 0 .. 59
      puts "#{diff_seconds} seconds ago"
    when 60 .. (3600-1)
      puts "#{diff_seconds/60} minutes ago"
    when 3600 .. (3600*24-1)
      puts "#{diff_seconds/3600} hours ago"
    when (3600*24) .. (3600*24*30) 
      puts "#{diff_seconds/(3600*24)} days ago"
    else
      puts start_time.strftime("%m/%d/%Y")
  end
end

По сути, это повторная реализация помощника distance_of_time_in_words: api.rubyonrails.com/classes/ActionView/Helpers/…

Grant Hutchins 12.10.2008 23:58

это означает, что вы не должны его использовать, и вы должны использовать встроенный

xaxxon 13.10.2011 07:44

Мне это кажется совершенно нормальным. Это позволяет вам настроить остальные струны. то есть «3 секунды назад» или «3 секунды назад»

raidfive 12.09.2012 07:13

#{diff_seconds/360} должен быть #{diff_seconds/3600}. Я его отредактировал.

Femaref 16.04.2013 16:04

Что о

30.seconds.ago
2.days.ago

Или что-то еще, ради чего вы снимались?

это наоборот от того, о чем говорится в вопросе.

xaxxon 15.10.2011 11:00

Похоже, вы ищете метод time_ago_in_words (или distance_of_time_in_words) от ActiveSupport. Назовите это так:

<%= time_ago_in_words(timestamp) %>

Подсказки для рубинового новичка, как запустить это в irb? Я запускаю: require 'active_support', а затем пробую 'time_ago_in_words (Time.now)', но функция не найдена.

cboettig 03.08.2012 04:24

@cboettig Это не часть ActiveSupport, это определено в ActionView::Helpers::DateHelper.

Michael Kohl 05.08.2012 13:51

вам не нужно требовать active_support, если вы используете консоль rails. существует консольный метод helper, который вы можете вызывать и получать доступ к этим методам. helper.time_ago_in_words(timestamp)

Matt Polito 03.10.2012 17:24

Просто fyi, если вы хотите это в irb или обычном Ruby, просто выполните: require 'active_support/core_ext' Сначала, и тогда все готово для использования 7.days.ago и других подобных конструкций.

likethesky 16.02.2013 00:06

большой! Я только что пришел сюда, ожидая образец кода, и нашел вот это. Я люблю рубин и рельсы

Marcelo Biffara 04.04.2013 23:30

Конструкция "N.units.since" все еще меня беспокоит, мне жаль, что они не использовали "N.units.hence" для обозначения времени в будущем ...

SciPhi 05.11.2013 22:13

Вот почему я люблю Руби

Andrew Hendrie 01.04.2015 07:55

Я написал это, но мне нужно проверить существующие методы, упомянутые, чтобы увидеть, лучше ли они.

module PrettyDate
  def to_pretty
    a = (Time.now-self).to_i

    case a
      when 0 then 'just now'
      when 1 then 'a second ago'
      when 2..59 then a.to_s+' seconds ago' 
      when 60..119 then 'a minute ago' #120 = 2 minutes
      when 120..3540 then (a/60).to_i.to_s+' minutes ago'
      when 3541..7100 then 'an hour ago' # 3600 = 1 hour
      when 7101..82800 then ((a+99)/3600).to_i.to_s+' hours ago' 
      when 82801..172000 then 'a day ago' # 86400 = 1 day
      when 172001..518400 then ((a+800)/(60*60*24)).to_i.to_s+' days ago'
      when 518400..1036800 then 'a week ago'
      else ((a+180000)/(60*60*24*7)).to_i.to_s+' weeks ago'
    end
  end
end

Time.send :include, PrettyDate

Хм, я прочитал первый рубин, а у рубина нет ActiveSupport из коробки. Так что я думаю, что этот пост более рубиновый. Однако в собственном вопросе есть упоминание о рельсах.

Jonke 14.10.2008 00:05

Rails - это веб-фреймворк, а базовый язык - ruby. Так что получить какой-то рубиновый код на вопрос о рельсах - это нормально. Даже если стандартный ruby ​​не включает ActiveRecord, он поддерживается только командой «gem install activerecord».

MickaelFM 19.05.2009 15:33

Вы можете поместить последнюю строку return в операторе case под else и удалить все return.

sawa 27.03.2011 07:50

может кто подскажет почему стоит +99+800+180000?

Gaurav Shah 29.11.2012 13:54

+99, потому что конец «час назад» заканчивается на 7100, что на 100 секунд меньше двух часов. Аналогично, +800, поскольку 172000 - это 800 секунд меньше двух дней (172800 секунд) и так далее.

Fred 16.07.2013 08:14

хороший пример того, как даже одно значение использования может выиграть от именованной переменной

Toni Leigh 22.10.2015 16:08

Взгляните на методы экземпляра здесь:

http://apidock.com/rails/Time

У этого есть полезные методы, такие как вчера, завтра, начало_недели, назад и т. д.

Примеры:

Time.now.yesterday
Time.now.ago(2.days).end_of_day
Time.now.next_month.beginning_of_month

Я написал гем, который делает это для объектов Rails ActiveRecord. В примере используется created_at, но он также будет работать с updated_at или чем-либо еще с классом ActiveSupport :: TimeWithZone.

Просто установите гем и вызовите «красивый» метод в своем экземпляре TimeWithZone.

https://github.com/brettshollenberger/hublot

Просто чтобы прояснить решение Эндрю Маршалла для использования time_ago_in_words
(для Rails 3.0 и Rails 4.0)

Если вы находитесь в поле зрения

<%= time_ago_in_words(Date.today - 1) %>

Если вы в контроллере

include ActionView::Helpers::DateHelper
def index
  @sexy_date = time_ago_in_words(Date.today - 1)
end

В контроллеры по умолчанию не импортирован модуль ActionView :: Helpers :: DateHelper.

N.B. Импорт помощников в ваши контроллеры - это не «рельсовый путь». Помощники предназначены для помощи просмотрам. Было решено, что метод time_ago_in_words является объектом Посмотреть в триаде MVC. (Я не согласен, но когда в Риме ...)

Поскольку большинство ответов здесь предлагает time_ago_in_words.

Вместо использования :

<%= time_ago_in_words(comment.created_at) %>

В Rails предпочтительнее:

<abbr class = "timeago" title = "<%= comment.created_at.getutc.iso8601 %>">
  <%= comment.created_at.to_s %>
</abbr>

вместе с библиотекой jQuery http://timeago.yarp.com/ с кодом:

$("abbr.timeago").timeago();

Главное преимущество: кеширование

http://rails-bestpractices.com/posts/2012/02/10/not-use-time_ago_in_words/

собственно, это time_ago_in_words, а не timeS

23tux 22.08.2017 11:19

Другой подход - выгрузить некоторую логику из бэкэнда и заставить браузер выполнять эту работу, используя плагины Javascript, такие как:

jQuery время назад или его Адаптация Rails Gem

Если вы создаете приложение Rails, вам следует использовать

Time.zone.now
Time.zone.today
Time.zone.yesterday

Это дает вам время или дату в часовом поясе, в котором вы настроили свое приложение Rails.

Например, если вы настроите свое приложение на использование UTC, тогда Time.zone.now всегда будет в формате UTC (например, на него не повлияет изменение британского летнего времени).

Вычислить относительное время легко, например

Time.zone.now - 10.minute
Time.zone.today.days_ago(5)

Другие вопросы по теме