ruby on rails - learn - Como você faz o tempo relativo no Rails?



ruby on rails application (8)

Eu estou escrevendo um aplicativo Rails, mas não consigo encontrar como fazer o tempo relativo, ou seja, se dada uma determinada classe de tempo, pode calcular "30 segundos atrás" ou "2 dias atrás" ou se é mais do que um mês "9/1/2008", etc.

https://src-bin.com


Answer #1

Algo assim funcionaria.

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

Answer #2

Apenas para esclarecer a solução de Andrew Marshall para usar o time_ago_in_words
(Para Rails 3.0 e Rails 4.0)

Se você está em uma visão

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

Se você estiver em um controlador

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

Os controladores não têm o módulo ActionView::Helpers::DateHelper importado por padrão.

NB Não é "o modo de trilhos" para importar ajudantes em seus controladores. Ajudantes são para ajudar visualizações. O método time_ago_in_words foi decidido como entidade de visualização na tríade MVC . (Eu não concordo, mas quando em Roma ...)


Answer #3

Eu escrevi isso, mas tenho que verificar os métodos existentes mencionados para ver se eles são melhores.

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

Answer #4

Eu escrevi uma gem que faz isso para objetos Rails ActiveRecord. O exemplo usa created_at, mas também funciona em updated_at ou qualquer coisa com a classe ActiveSupport :: TimeWithZone.

Apenas gem install e chame o método 'pretty' na sua instância TimeWithZone.

https://github.com/brettshollenberger/hublot



Answer #6

Se você está construindo uma aplicação Rails, você deve usar

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

Isso lhe dá tempo ou data no fuso horário com o qual você configurou seu aplicativo Rails.

Por exemplo, se você configurar seu aplicativo para usar o UTC, o Time.zone.now sempre estará no horário UTC (ele não será afetado pela alteração do British Summertime, por exemplo).

Calcular o tempo relativo é fácil, por exemplo

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

Answer #7

Você pode usar os operadores aritméticos para fazer o tempo relativo.

Time.now - 2.days 

Vai te dar 2 dias atrás.






ruby