我正在写一个Rails应用程序,但似乎无法找到如何做相对时间,即如果给定某个时间类,它可以计算"30秒前"或"2天前"或者如果它超过一个月"9/1/2008"等
听起来像是在寻找ActiveSupport 的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
只是为了澄清Andrew Marshall使用time_ago_in_words
的解决方案
(For 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_ago_in_words.
而不是使用:
<%= time_ago_in_words(comment.created_at) %>
在Rails中,更喜欢:
<%= comment.created_at.to_s %>
以及jQuery库http://timeago.yarp.com/,代码如下:
$("abbr.timeago").timeago();
主要优点:缓存
http://rails-bestpractices.com/posts/2012/02/10/not-use-time_ago_in_words/
看一下这里的实例方法:
http://apidock.com/rails/Time
这有一些有用的方法,如昨天,明天,开始_周末,以前等.
例子:
Time.now.yesterday Time.now.ago(2.days).end_of_day Time.now.next_month.beginning_of_month