Sto scrivendo un'applicazione Rails, ma non riesco a trovare come fare il tempo relativo, ad esempio se viene data una determinata classe Time, può calcolare "30 secondi fa" o "2 giorni fa" o se è più lungo di un mese "9/1/2008", ecc.
Sto scrivendo un'applicazione Rails, ma non riesco a trovare come fare il tempo relativo, ad esempio se viene data una determinata classe Time, può calcolare "30 secondi fa" o "2 giorni fa" o se è più lungo di un mese "9/1/2008", ecc.
Risposte:
Sembra che tu stia cercando il time_ago_in_words
metodo (o distance_of_time_in_words
), da ActiveSupport. Chiamalo così:
<%= time_ago_in_words(timestamp) %>
ActiveSupport
, è definito in ActionView::Helpers::DateHelper
.
helper
che è possibile chiamare e accedere a questi metodi. helper.time_ago_in_words(timestamp)
require 'active_support/core_ext'
Primo, e poi sei pronto per usare 7.days.ago
e altri costrutti simili.
Ho scritto questo, ma devo controllare i metodi esistenti menzionati per vedere se sono migliori.
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
riga all'interno dell'istruzione case
sotto else
e rimuovere tutte le return
s.
+99
+800
+180000
?
Giusto per chiarire la soluzione di Andrew Marshall per l'utilizzo di time_ago_in_words
(per Rails 3.0 e Rails 4.0)
Se sei in vista
<%= time_ago_in_words(Date.today - 1) %>
Se sei in un controller
include ActionView::Helpers::DateHelper
def index
@sexy_date = time_ago_in_words(Date.today - 1)
end
I controller non hanno il modulo ActionView :: Helpers :: DateHelper importato per impostazione predefinita.
NB Non è "il modo di guida" per importare gli helper nei controller. Gli helper sono utili per le visualizzazioni. Il metodo time_ago_in_words è stato deciso di essere un'entità vista nella triade MVC . (Non sono d'accordo ma quando a Roma ...)
È possibile utilizzare gli operatori aritmetici per eseguire il tempo relativo.
Time.now - 2.days
Ti darà 2 giorni fa.
2.days.since
oppure2.days.from_now
Qualcosa del genere avrebbe funzionato.
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}
dovrebbe essere #{diff_seconds/3600}
. L'ho modificato.
Poiché la maggior parte delle risposte qui suggerisce time_ago_in_words .
Invece di usare :
<%= time_ago_in_words(comment.created_at) %>
In Rails, preferisci:
<abbr class="timeago" title="<%= comment.created_at.getutc.iso8601 %>">
<%= comment.created_at.to_s %>
</abbr>
insieme a una libreria jQuery http://timeago.yarp.com/ , con codice:
$("abbr.timeago").timeago();
Vantaggio principale: memorizzazione nella cache
http://rails-bestpractices.com/posts/2012/02/10/not-use-time_ago_in_words/
time_ago_in_words
momento S
Dai un'occhiata ai metodi di istanza qui:
Questo ha metodi utili come ieri, domani, inizio_di_settimana, fa, ecc.
Esempi:
Time.now.yesterday
Time.now.ago(2.days).end_of_day
Time.now.next_month.beginning_of_month
Ho scritto un gioiello che lo fa per gli oggetti Rails ActiveRecord. L'esempio usa Created_at, ma funzionerà anche su updated_at o altro con la classe ActiveSupport :: TimeWithZone.
Basta installare gem e chiamare il metodo 'pretty' sulla tua istanza di TimeWithZone.
Se stai creando un'applicazione Rails, dovresti usarla
Time.zone.now
Time.zone.today
Time.zone.yesterday
Questo ti dà l'ora o la data nel fuso orario con cui hai configurato l'applicazione Rails.
Ad esempio, se si configura l'applicazione per l'utilizzo di UTC, Time.zone.now
sarà sempre in orario UTC (ad esempio, non sarà influenzato dalla modifica dell'ora legale britannica).
Il calcolo del tempo relativo è semplice, ad es
Time.zone.now - 10.minute
Time.zone.today.days_ago(5)
Un altro approccio è quello di scaricare un po 'di logica dal back-end e fare in modo che il browser faccia il lavoro usando plugin Javascript come:
jQuery tempo fa o il suo adattamento Rails Gem