【问题标题】:Ruby Date Subtraction (e.g. 90 days Ago)Ruby 日期减法(例如 90 天前)
【发布时间】:2011-07-07 11:10:28
【问题描述】:

我有点被以下的 joda-time API 宠坏了:

DateTime now = new DateTime();
DateTime ninetyDaysAgo = now.minusDays(90);

我正在尝试在 Ruby 中做类似的事情,但我是

now = Time.now
ninetyDaysAgo = now - (90*24)

但是,这里的数学是错误的(我真的在处理午夜的日期)。

是否有友好的日期减法 API?

【问题讨论】:

    标签: ruby date


    【解决方案1】:
    require 'date'
    now = Date.today
    ninety_days_ago = (now - 90)
    

    通过 IRB 控制台运行它,我得到:

    >>require 'date'
    now = Date.today
    ninety_days_ago = (now - 90)
    
    require 'date'
    => false
    now = Date.today
    => #<Date: 2011-03-02 (4911245/2,0,2299161)>
    ninety_days_ago = (now - 90)
    => #<Date: 2010-12-02 (4911065/2,0,2299161)>
    

    如果你需要时间,你可以说now = DateTime.now

    【讨论】:

    • 您的原始帖子,预编辑更接近我需要的内容,但 Date.Now 受到保护。 Date.today 工作。如果您将第一个简介更改为 now = Date.today,我会接受。
    • @Matt: 以及如何减去 90 小时而不是天数?
    • @EstebanFeldman Date 也允许使用分数,因此您可以使用 Date.today - (90.0/24.0)。结果也可以轻松转换为to_datetimeto_time
    【解决方案2】:

    如果您使用 Rails 或不介意包含 ActiveSupport,您可以像这样使用Numeric#days DSL:

    ruby-1.9.2-p136 :002 > Date.today
     => Wed, 02 Mar 2011 
    ruby-1.9.2-p136 :003 > Date.today - 90.days
     => Thu, 02 Dec 2010 
    

    由于您使用的是日期而不是时间,您还应该从 Date 实例开始,或者使用 #to_date 转换您的 DateTime 实例。从日期实例中添加/减去数字时,数字是隐含的天数。

    ruby-1.9.2-p136 :016 > DateTime.now.to_date
     => #<Date: 2011-03-02 (4911245/2,0,2299161)> 
    ruby-1.9.2-p136 :017 > DateTime.now.to_date - 90
     => #<Date: 2010-12-02 (4911065/2,0,2299161)> 
    

    【讨论】:

      【解决方案3】:

      对于那些使用 Rails 的人,请查看以下内容:

      DateTime.now - 10.days
      => Sat, 04 May 2013 12:12:07 +0300
      
      20.days.ago - 10.days
      => Sun, 14 Apr 2013 09:12:13 UTC +00:00
      

      【讨论】:

        【解决方案4】:

        这是一篇超级旧的帖子,但如果您想保留 Time 对象,就像最初询问的那样,而不是切换到 Date 对象,您可能需要考虑使用 Ruby Facets

        Ruby Facets 是核心 Ruby 类的标准化扩展库。

        http://rubyworks.github.io/facets/

        通过要求 Facets,您可以对 Time 对象执行以下操作。

        Time.now.less(90, :days)

        【讨论】:

        • 这个项目已经两年没有更新了,只用一条评论打开了问题。它已经死了。
        • @user4674453 最后一次更新是六个月前。它是一个稳定的库,仍然适用于最新版本的 Ruby。并非所有代码库都需要每天更新才能不被视为“死”。
        【解决方案5】:

        Ruby 支持Date and DateTime classes 中的日期运算,这是Ruby 标准库的一部分。这两个类都公开了#+#- 方法,它们在日期或时间中加减天数。

        $ irb
         > require 'date'
         => true 
         > (DateTime.new(2015,4,1) - 90).to_s  # Apr 1, 2015 - 90 days
         => "2015-01-01T00:00:00+00:00"
         > (DateTime.new(2015,4,1) - 1).to_s   # Apr 1, 2015 - 1 day
         => "2015-03-31T00:00:00+00:00" 
        

        使用#<<#>> 方法可以按月而不是按天进行操作。月算术与天算术略有不同。用 Date 代替 DateTime 效果更明显。

         > (Date.new(2015, 5, 31) << 3).to_s  # May 31 - 3 months; 92 days diff
         => "2015-02-28" 
        

        按照您的 joda-time 示例,您可能会在 Ruby 中编写类似这样的内容。

        now =  DateTime.now
        ninety_days_ago = now - 90
        

        或者只是

        ninety_days_ago = DateTime.now - 90
        

        【讨论】:

          【解决方案6】:

          使用秒数:

          Time.now - 90*24*60*60
          

          【讨论】:

            【解决方案7】:

            使用 Rails Active Support 的简单解决方案:

            days90_ago = 90.days.ago.to_date.to_s
            
            OUTPUT:
            puts 90_days_ago
            => "2019-10-09" # considering cur_date: 2020-01-07
            

            【讨论】:

            • 这是使用 ActiveSupport (Rails)。
            猜你喜欢
            • 1970-01-01
            • 2021-11-09
            • 2011-04-23
            • 2021-11-11
            • 2012-04-29
            • 1970-01-01
            • 1970-01-01
            • 2018-12-21
            • 1970-01-01
            相关资源
            最近更新 更多