你如何在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
看看这里的实例方法:
这有一些有用的方法,比如昨天,明天,开始,以前等等。
例子:
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实例上安装并调用“漂亮”方法即可。
另一种方法是从后端卸载一些逻辑,并通过使用JavaScript插件来完成这项工作,例如:
jQuery时间之前或者它的Rails Gem适应