Estoy escribiendo una aplicación Rails, pero parece que no puedo encontrar cómo hacer el tiempo relativo, es decir, si se le da una cierta clase de tiempo, puede calcular "hace 30 segundos" o "hace 2 días" o si es más de un mes "1/9/2008", etc.
Estoy escribiendo una aplicación Rails, pero parece que no puedo encontrar cómo hacer el tiempo relativo, es decir, si se le da una cierta clase de tiempo, puede calcular "hace 30 segundos" o "hace 2 días" o si es más de un mes "1/9/2008", etc.
Respuestas:
Parece que está buscando el time_ago_in_words
método (o distance_of_time_in_words
), de ActiveSupport. Llámalo así:
<%= time_ago_in_words(timestamp) %>
ActiveSupport
, está definido en ActionView::Helpers::DateHelper
.
helper
que puede llamar y acceder a estos métodos. helper.time_ago_in_words(timestamp)
require 'active_support/core_ext'
Primero, y luego estarás listo para usar 7.days.ago
y otras construcciones similares.
He escrito esto, pero tengo que verificar los métodos existentes mencionados para ver si son mejores.
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
dentro del case
enunciado debajo else
y eliminar todos los return
s.
+99
+800
+180000
?
Solo para aclarar la solución de Andrew Marshall para usar time_ago_in_words
(Para Rails 3.0 y Rails 4.0)
Si estás en una vista
<%= time_ago_in_words(Date.today - 1) %>
Si estás en un controlador
include ActionView::Helpers::DateHelper
def index
@sexy_date = time_ago_in_words(Date.today - 1)
end
Los controladores no tienen el módulo ActionView :: Helpers :: DateHelper importado por defecto.
NB No es "el camino de los rieles" importar ayudantes a sus controladores. Los ayudantes son para ayudar a las vistas. Se decidió que el método time_ago_in_words era una entidad de vista en la tríada MVC . (No estoy de acuerdo, pero cuando en Roma ...)
Puede usar los operadores aritméticos para hacer un tiempo relativo.
Time.now - 2.days
Te lo daré hace 2 días.
2.days.since
o2.days.from_now
Algo como esto funcionaría.
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}
debería ser #{diff_seconds/3600}
. Lo he editado
Como la mayor respuesta aquí sugiere time_ago_in_words .
En lugar de usar :
<%= time_ago_in_words(comment.created_at) %>
En Rails, prefiere:
<abbr class="timeago" title="<%= comment.created_at.getutc.iso8601 %>">
<%= comment.created_at.to_s %>
</abbr>
junto con una biblioteca jQuery http://timeago.yarp.com/ , con el código:
$("abbr.timeago").timeago();
Ventaja principal: almacenamiento en caché
http://rails-bestpractices.com/posts/2012/02/10/not-use-time_ago_in_words/
time_ago_in_words
hora S
Eche un vistazo a los métodos de instancia aquí:
Esto tiene métodos útiles como ayer, mañana, comienzo_de_semana, ago, etc.
Ejemplos:
Time.now.yesterday
Time.now.ago(2.days).end_of_day
Time.now.next_month.beginning_of_month
He escrito una gema que hace esto para los objetos ActiveRecord de Rails. El ejemplo usa created_at, pero también funcionará en updated_at o cualquier cosa con la clase ActiveSupport :: TimeWithZone.
Simplemente instale gem y llame al método 'bonito' en su instancia de TimeWithZone.
Si está creando una aplicación Rails, debe usar
Time.zone.now
Time.zone.today
Time.zone.yesterday
Esto le da la hora o fecha en la zona horaria con la que ha configurado su aplicación Rails.
Por ejemplo, si configura su aplicación para usar UTC, Time.zone.now
siempre estará en hora UTC (por ejemplo, no se verá afectado por el cambio de horario de verano británico).
Calcular el tiempo relativo es fácil, p. Ej.
Time.zone.now - 10.minute
Time.zone.today.days_ago(5)
Otro enfoque es descargar algo de lógica del backend y hacer que el navegador haga el trabajo mediante el uso de complementos de Javascript como: