Answers:
听起来好像您正在从ActiveSupport 寻找time_ago_in_words
方法(或distance_of_time_in_words
)。这样称呼它:
<%= time_ago_in_words(timestamp) %>
ActiveSupport
,它在中定义ActionView::Helpers::DateHelper
。
helper
,您可以调用和访问这些方法。 helper.time_ago_in_words(timestamp)
require 'active_support/core_ext'
首先,然后就可以使用7.days.ago
和其他类似的构造了。
我已经写了这个,但是必须检查提到的现有方法,看看它们是否更好。
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
一行放在case
下方的语句中else
,并删除所有return
。
+99
+800
+180000
吗?
只是为了阐明Andrew Marshall使用time_ago_in_words
的解决方案
(对于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三元组中的视图实体。(我不同意,但在罗马时...)
您可以使用算术运算符计算相对时间。
Time.now - 2.days
将在2天前给您。
2.days.since
或2.days.from_now
这样的事情会起作用。
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}
应该是#{diff_seconds/3600}
。我已经编辑了
由于这里的答案最多,建议使用time_ago_in_words。
而不是使用:
<%= time_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();
主要优点:缓存
http://rails-bestpractices.com/posts/2012/02/10/not-use-time_ago_in_words/
time_ago_in_words
不是时间S
在这里看看实例方法:
这具有有用的方法,例如昨天,明天,周初,前等。
例子:
Time.now.yesterday
Time.now.ago(2.days).end_of_day
Time.now.next_month.beginning_of_month
我已经编写了一个可以为Rails ActiveRecord对象执行此操作的工具。该示例使用created_at,但它也适用于updated_at或ActiveSupport :: TimeWithZone类的任何对象。
只需安装gem并在您的TimeWithZone实例上调用“ pretty”方法即可。
另一种方法是从后端卸载一些逻辑,并通过使用Javascript插件使浏览器完成此工作,例如: