你如何在Rails中做相对时间?

我正在编写一个Rails应用程序,但似乎无法find相对的时间,也就是说,如果给定某个Time类,它可以计算“30秒前”或“2天前”,或者如果超过一个月“2008年9月1日”等

听起来就像你正在寻找time_ago_in_words方法(或distance_of_time_in_words )。 像这样调用它:

 <%= time_ago_in_words(timestamp) %> 

我写了这个,但必须检查提到的现有方法,看看他们是否更好。

 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 

只是为了澄清安德鲁·马歇尔使用time_ago_in_words的解决scheme
(对于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

注意:将助手导入控制器不是“导轨方式”。 帮手是为了帮助意见。 time_ago_in_words方法被确定为MVC黑社会中的一个视图实体。 (我不同意,但在罗马时……)

关于什么

 30.seconds.ago 2.days.ago 

还是别的什么你在拍?

您可以使用算术运算符来做相对时间。

 Time.now - 2.days 

2天前会给你。

像这样的东西会工作。

 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 

看看这里的实例方法:

http://apidock.com/rails/Time

这有一些有用的方法,比如昨天,明天,开始,以前等等。

例子:

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

由于这里的最多答案build议time_ago_in_words

而不是使用:

 <%= times_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(); 

主要优点:caching

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

我写了一个为Rails ActiveRecord对象做这个的gem。 该示例使用created_at,但它也将工作在updated_at或类ActiveSupport :: TimeWithZone类。

只需在您的TimeWithZone实例上安装并调用“漂亮”方法即可。

https://github.com/brettshollenberger/hublot

另一种方法是从后端卸载一些逻辑,并通过使用JavaScript插件来完成这项工作,例如:

jQuery时间之前或者它的Rails Gem适应