Estou escrevendo um aplicativo Rails, mas parece que não consigo encontrar um tempo relativo, ou seja, se receber uma determinada classe Time, ele pode calcular "30 segundos atrás" ou "2 dias atrás" ou se for mais de um mês "1/9/2008" etc.
Estou escrevendo um aplicativo Rails, mas parece que não consigo encontrar um tempo relativo, ou seja, se receber uma determinada classe Time, ele pode calcular "30 segundos atrás" ou "2 dias atrás" ou se for mais de um mês "1/9/2008" etc.
Respostas:
Parece que você está procurando o time_ago_in_words
método (ou distance_of_time_in_words
), do ActiveSupport. Chame assim:
<%= time_ago_in_words(timestamp) %>
ActiveSupport
, está definido em ActionView::Helpers::DateHelper
.
helper
que você pode chamar e acessar esses métodos. helper.time_ago_in_words(timestamp)
require 'active_support/core_ext'
Primeiro, e então você estará pronto para usar 7.days.ago
e outras construções semelhantes.
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
return
linha na case
instrução em else
e remover todos os return
s.
+99
+800
+180000
?
Apenas para esclarecer a solução de Andrew Marshall para usar time_ago_in_words
(For 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 possuem o módulo ActionView :: Helpers :: DateHelper importado por padrão.
NB Não é "o caminho dos trilhos" importar importadores para seus controladores. Os ajudantes são para ajudar as visualizações. O método time_ago_in_words foi decidido como uma entidade de exibição na tríade MVC . (Eu não concordo, mas quando em Roma ...)
A respeito
30.seconds.ago
2.days.ago
Ou algo mais para o qual você estava filmando?
Você pode usar os operadores aritméticos para fazer um tempo relativo.
Time.now - 2.days
Vai lhe dar 2 dias atrás.
2.days.since
or2.days.from_now
Algo assim iria funcionar.
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
#{diff_seconds/360}
deveria ser #{diff_seconds/3600}
. Eu editei.
Como a maioria das respostas aqui sugere time_ago_in_words .
Ao invés de usar :
<%= time_ago_in_words(comment.created_at) %>
No Rails, prefira:
<abbr class="timeago" title="<%= comment.created_at.getutc.iso8601 %>">
<%= comment.created_at.to_s %>
</abbr>
junto com uma biblioteca jQuery http://timeago.yarp.com/ , com o código:
$("abbr.timeago").timeago();
Principal vantagem: armazenamento em cache
http://rails-bestpractices.com/posts/2012/02/10/not-use-time_ago_in_words/
time_ago_in_words
hora S
Dê uma olhada nos métodos da instância aqui:
Isso tem métodos úteis, como ontem, amanhã, início de semana, atrás etc.
Exemplos:
Time.now.yesterday
Time.now.ago(2.days).end_of_day
Time.now.next_month.beginning_of_month
Eu escrevi uma jóia que faz isso para objetos Rails ActiveRecord. O exemplo usa created_at, mas também funcionará em updated_at ou qualquer coisa com a classe ActiveSupport :: TimeWithZone.
Basta instalar o gem e chamar o método 'pretty' na sua instância do TimeWithZone.
Se você estiver criando um aplicativo Rails, use
Time.zone.now
Time.zone.today
Time.zone.yesterday
Isso indica a hora ou a data no fuso horário com o qual você configurou seu aplicativo Rails.
Por exemplo, se você configurar seu aplicativo para usar o UTC, Time.zone.now
sempre estará no horário UTC (não será afetado pela mudança do horário de verão britânico, por exemplo).
Calcular o tempo relativo é fácil, por exemplo
Time.zone.now - 10.minute
Time.zone.today.days_ago(5)
Outra abordagem é descarregar alguma lógica do back-end e fazer com que o navegador faça o trabalho usando plug-ins Javascript, como: