【问题标题】:How Do I Loop Through a Date Range in Reverse?如何反向循环遍历日期范围?
【发布时间】:2011-02-19 16:13:11
【问题描述】:

我有一个日期范围,我希望能够反向循环。给出以下内容,我将如何做到这一点,标准的Range 运算符似乎无法正常工作。

>> sd = Date.parse('2010-03-01')
=> Mon, 01 Mar 2010
>> ed = Date.parse('2010-03-05')
=> Fri, 05 Mar 2010
>> (sd..ed).to_a
=> [Mon, 01 Mar 2010, Tue, 02 Mar 2010, Wed, 03 Mar 2010, Thu, 04 Mar 2010, Fri, 05 Mar     2010]
>> (ed..sd).to_a
=> []

如您所见,范围运算符从头到尾正常工作,但不是从头到尾。

【问题讨论】:

    标签: ruby-on-rails ruby range date-range


    【解决方案1】:

    尝试 upto/downto :

    irb(main):003:0> sd = Date.parse('2010-03-01')
    => #<Date: 4910513/2,0,2299161>
    irb(main):004:0> ed = Date.parse('2010-03-15')
    => #<Date: 4910541/2,0,2299161>
    irb(main):005:0> sd.upto(ed) { |date| puts date }
    2010-03-01
    2010-03-02
    2010-03-03
    2010-03-04
    2010-03-05
    2010-03-06
    2010-03-07
    2010-03-08
    2010-03-09
    2010-03-10
    2010-03-11
    2010-03-12
    2010-03-13
    2010-03-14
    2010-03-15
    => #<Date: 4910513/2,0,2299161>
    irb(main):006:0> ed.downto(sd) { |date| puts date }
    2010-03-15
    2010-03-14
    2010-03-13
    2010-03-12
    2010-03-11
    2010-03-10
    2010-03-09
    2010-03-08
    2010-03-07
    2010-03-06
    2010-03-05
    2010-03-04
    2010-03-03
    2010-03-02
    2010-03-01
    => #<Date: 4910541/2,0,2299161>
    

    【讨论】:

    • 如果你很懒,你也可以简单地使用 .collect.reverse ,它在大多数情况下都可以正常工作。
    • 除了它必须先构建整个数组然后反转它。 upto 和 downto 是枚举数。
    【解决方案2】:

    我通常只是反转结果数组:

    ruby-1.8.7-p72 > sd = Date.parse('2010-03-01')
     => Mon, 01 Mar 2010 
    ruby-1.8.7-p72 > ed = Date.parse('2010-03-05')
     => Fri, 05 Mar 2010 
    ruby-1.8.7-p72 > (sd..ed).to_a
     => [Mon, 01 Mar 2010, Tue, 02 Mar 2010, Wed, 03 Mar 2010, Thu, 04 Mar 2010, Fri, 05 Mar 2010] 
    ruby-1.8.7-p72 > (sd..ed).to_a.reverse
     => [Fri, 05 Mar 2010, Thu, 04 Mar 2010, Wed, 03 Mar 2010, Tue, 02 Mar 2010, Mon, 01 Mar 2010] 
    

    我想,当你不知道开始日期是在结束日期之前还是之后,要让它做正确的事情,你会想要一些类似的东西:

    def date_range(sd, ed)
      sd < ed ? (sd..ed).to_a : (ed..sd).to_a.reverse
    end
    

    无论哪种方式,这都会给你正确的东西:

    ruby-1.8.7-p72 > sd = Date.parse('2010-03-01')
     => Mon, 01 Mar 2010 
    ruby-1.8.7-p72 > ed = Date.parse('2010-03-05')
     => Fri, 05 Mar 2010 
    ruby-1.8.7-p72 > date_range(sd, ed)
     => [Mon, 01 Mar 2010, Tue, 02 Mar 2010, Wed, 03 Mar 2010, Thu, 04 Mar 2010, Fri, 05 Mar 2010] 
    ruby-1.8.7-p72 > date_range(ed, sd)
     => [Fri, 05 Mar 2010, Thu, 04 Mar 2010, Wed, 03 Mar 2010, Tue, 02 Mar 2010, Mon, 01 Mar 2010] 
    

    【讨论】:

    • 我得到了以下但不能再做[Mon, 01 Mar 2010, Tue, 02 Mar 2010, Wed, 03 Mar 2010, Thu, 04 Mar 2010, Fri, 05 Mar 2010]
    猜你喜欢
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 2020-03-06
    • 1970-01-01
    • 2023-02-17
    • 1970-01-01
    • 2021-12-30
    相关资源
    最近更新 更多