【问题标题】:How can I find the number of days between two Date objects in Ruby?如何在 Ruby 中找到两个 Date 对象之间的天数?
【发布时间】:2011-05-28 23:37:37
【问题描述】:

如何找到两个 Date 对象之间的天数?

【问题讨论】:

    标签: ruby date


    【解决方案1】:

    结束日期减去开始日期:

    endDate - beginDate 
    

    【讨论】:

    • 认为您的意思是从结束日期中减去开始日期 :)
    • 注意:如果您在 irb 中使用 Wirble(为输出着色),则有理数的末尾将连接一个 1。哎呀!您可能想使用 to_i 将结果转换为整数
    • 如果你有一个DateTime对象,一定要先转换成Date,否则它会返回秒数(我猜)。
    • 另请注意,减去两个 Date 对象会得到一个 Rational,您可能需要将其转换为整数,就像 (endDate - beginDate).to_i 一样
    • 另一个有用的方法是:(endDate.to_date - beginDate.to_date).to_i
    【解决方案2】:
    irb(main):005:0> a = Date.parse("12/1/2010")
    => #<Date: 4911063/2,0,2299161>
    
    irb(main):007:0> b = Date.parse("12/21/2010")
    => #<Date: 4911103/2,0,2299161>
    
    irb(main):016:0> c = b.mjd - a.mjd
    => 20
    

    这使用Modified Julian Day Number

    来自wikipedia

    儒略日期 (JD) 是自公元前 4713 年 1 月 1 日格林威治正午,儒略历法以来的时间间隔,以天为单位。

    【讨论】:

      【解决方案3】:

      这可能在 Ruby 2.0 中有所改变

      当我这样做时,我得到了一小部分。例如在控制台上(irb 或 rails c)

      2.0.0-p195 :005 > require 'date'
       => true 
      2.0.0-p195 :006 >  a_date = Date.parse("25/12/2013")
       => #<Date: 2013-12-25 ((2456652j,0s,0n),+0s,2299161j)> 
      2.0.0-p195 :007 >  b_date = Date.parse("10/12/2013")
       => #<Date: 2013-12-10 ((2456637j,0s,0n),+0s,2299161j)> 
      2.0.0-p195 :008 > a_date-b_date
       => (15/1) 
      

      当然,转换为 int 会得到预期的结果

      2.0.0-p195 :009 > (a_date-b_date).to_i
       => 15 
      

      这也适用于 DateTime 对象,但您必须考虑秒数,例如此示例

      2.0.0-p195 :017 >   a_date_time = DateTime.now
       => #<DateTime: 2013-12-31T12:23:03-08:00 ((2456658j,73383s,725757000n),-28800s,2299161j)> 
      2.0.0-p195 :018 > b_date_time = DateTime.now-20
       => #<DateTime: 2013-12-11T12:23:06-08:00 ((2456638j,73386s,69998000n),-28800s,2299161j)> 
      2.0.0-p195 :019 > a_date_time - b_date_time
       => (1727997655759/86400000000) 
      2.0.0-p195 :020 > (a_date_time - b_date_time).to_i
       => 19 
      2.0.0-p195 :021 > c_date_time = a_date_time-20
       => #<DateTime: 2013-12-11T12:23:03-08:00 ((2456638j,73383s,725757000n),-28800s,2299161j)> 
      2.0.0-p195 :022 > a_date_time - c_date_time
       => (20/1) 
      2.0.0-p195 :023 > (a_date_time - c_date_time).to_i
       => 20 
      

      【讨论】:

        【解决方案4】:

        在 Ruby 2.1.3 中,情况发生了变化:

        > endDate = Date.new(2014, 1, 2)
         => #<Date: 2014-01-02 ((2456660j,0s,0n),+0s,2299161j)> 
        > beginDate = Date.new(2014, 1, 1)
         => #<Date: 2014-01-01 ((2456659j,0s,0n),+0s,2299161j)> 
        > days = endDate - beginDate
         => (1/1) 
        > days.class
         => Rational 
        > days.to_i
         => 1 
        

        【讨论】:

          【解决方案5】:

          这个怎么样?

          (beginDate...endDate).count
          

          The Range 是一组独特的连续剧。 ... 是一个专有的 Range 文字。

          所以beginDate..(endDate - 1) 是一样的。除了不是。

          如果 beginDate 等于 endDate,由于唯一性,第一个元素将被排除,... 将排除最后一个。因此,如果我们想要 .count 今天和今天之间的日期,它将返回 0。

          【讨论】:

          • 这是一个非常好的答案,如果 beginDate 早于 endDate,它将返回 0,这在某些情况下非常有效。此外,如果两个日期相同,它将返回 0。它还返回一个普通整数。其他答案必须转换为整数,或者如果结果是否定的,您可能必须转换为 0。
          【解决方案6】:

          这对我有用:

          (endDate - beginDate).to_i
          

          【讨论】:

            【解决方案7】:

            试试这个:

            num_days = later_date - earlier_date
            

            【讨论】:

              【解决方案8】:

              所有这些都将我引向正确的结果,但我最终还是这样做了

              DateTime.now.mjd - DateTime.parse("01-01-1995").mjd
              

              【讨论】:

              • 需要指出的一点是:Ruby 中的 DateTime.parse 期望日期以 DD/MM/YYYY 或 DD-MM-YYYY 的形式给出。作为一个美国人,它总是让我失望!
              • @rickumali 作为来自世界其他地方的成员,我感谢 Ruby 使用“我们的”默认日期格式。
              • @rickumali Ruby 也接受 YYYY-MM-DD 格式的日期,这是每个人都应该使用的格式。
              【解决方案9】:

              天数 = (endDate - beginDate)/(60*60*24)

              【讨论】:

              • 日期是以天为单位的,所以你不需要这样做。我认为您的解决方案与 DateTime 差异有关。
              【解决方案10】:

              好吧,请注意你所说的“之间”是什么意思......

              days_apart = (to - from).to_i     # from + days_apart = to
              total_days = (to - from).to_i + 1 # number of "selected" days
              in_between_days = (to - from).to_i - 1 # how many days are in between from and to, i.e. excluding those two days
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-10-25
                • 2018-04-20
                • 1970-01-01
                • 2019-02-03
                • 2017-08-18
                • 2021-08-07
                相关资源
                最近更新 更多