当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《你如何在Rails中做相对时间?》经验,为你挑选了8个好方法。

我正在写一个Rails应用程序,但似乎无法找到如何做相对时间,即如果给定某个时间类,它可以计算"30秒前"或"2天前"或者如果它超过一个月"9/1/2008"等



1> Ben Scofield..:

听起来像是在寻找ActiveSupport 的time_ago_in_words方法(或distance_of_time_in_words).像这样称呼它:

<%= time_ago_in_words(timestamp) %>


如果您在rails控制台中,则不需要'active_support'.有一个名为`helper`的控制台方法,您可以调用它并访问这些方法.`helper.time_ago_in_words(时间戳)`
关于如何在irb中运行这个红宝石新手的提示?我运行:require'active_support'然后尝试'time_ago_in_words(Time.now)',但找不到该功能.
@cboettig它不是`ActiveSupport`的一部分,它在`ActionView :: Helpers :: DateHelper`中定义.
只是fyi,如果你想在irb或简单的Ruby中使用它,只需执行:```require'active_support/core_ext'```首先,然后你就可以使用`7.days.ago`和其他类似的结构.

2> MattW...:

我写过这个,但必须检查提到的现有方法,看看它们是否更好.

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


你可以把`case`语句中的最后一个`return`行放在`else`下,并删除所有`return`s.
有谁能说出为什么有"+ 99"`+ 800`` + 180000`?

3> seo..:

只是为了澄清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三元组.(我不同意,但在罗马时...)



4> Honza..:

关于什么

30.seconds.ago
2.days.ago

或者你正在拍摄的其他东西?


这是问题陈述的倒退.

5> 小智..:

您可以使用算术运算符来执行相对时间.

Time.now - 2.days 

2天前会给你.


@NixNinja:`2.days.since`或`2.days.from_now`
你知道2.days.ago吗?
这是问题的回答.time_ago_in_words是问题的答案.
是否有"Time.now + 2.days"的简写方法?

6> Gordon Wilso..:

像这样的东西会起作用.

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


这实际上是distance_of_time_in_words助手的重新实现:http://api.rubyonrails.com/classes/ActionView/Helpers/DateHelper.html#M001712
这意味着你不应该使用它,你应该使用内置的

7> Rahul garg..:

由于这里的答案最多,建议使用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/



8> davogones..:

看一下这里的实例方法:

http://apidock.com/rails/Time

这有一些有用的方法,如昨天,明天,开始_周末,以前等.

例子:

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

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有