【问题标题】:is it possible to create a date range in ruby from negative infinity是否可以从负无穷大创建红宝石日期范围
【发布时间】:2019-10-28 20:56:12
【问题描述】:

我正在努力在 Ruby (2.6.3) 中定义一个日期范围,它表示到给定日期的日期范围(在我的示例中是 Date.today):

BigDecimal("Infinity")...Date.today

*** ArgumentError 异常:范围值错误

nil...Date.today

*** ArgumentError 异常:范围值错误

Date::Infinity.new...Date.today

*** ArgumentError 异常:范围值错误

(Date.today...-Date::Infinity.new)

2019 年 5 月 31 日星期五...#

这个没有中断,但似乎也没有给我一个有意义的日期范围:

(Date.today...-Date::Infinity.new).include? Date.yesterday

【问题讨论】:

  • (Date.today..-Date::Infinity.new).to_a 只是一个空数组。
  • 这个的用例是什么?你想要的范围与“任何小于今天的日期”相同,你想在那个范围内做什么?这听起来太复杂了,也许有更好的选择来做任何你想做的事情。

标签: ruby-on-rails ruby


【解决方案1】:

也许不是最好的解决方案,但它可能会有所帮助:

(-Float::INFINITY...Date.today.to_time.to_i).include? Date.yesterday.to_time.to_i
 => true

【讨论】:

    【解决方案2】:

    从 ruby​​ 2.7 开始,这不再是问题,可以优雅地处理无限范围:

    (..Date.today).cover?(100.years.ago)
    => true
    (nil..Date.today).cover?(100.years.ago)
    => true
    

    【讨论】:

      【解决方案3】:

      为什么需要无穷大?你真的需要回到多远的时间?你不能做这样的事情吗:

      [*100.year.ago.to_date...Date.today]
      

      【讨论】:

      • 这可能就是我最终要做的事情——我的应用程序还需要能够区分从 -infinity 开始的范围和从定义时间开始的范围,我会不希望依赖于任意 100 年的值。这还不是最糟糕的事情,但我希望 Ruby 的无限范围支持能让它成为可能
      • 我明白了,但是您可以做一些有些武断的事情,但仍然涵盖您的用例。如果您提供您的实现或规范的代码示例,这也可能会有所帮助。
      • 我认为这实际上比负无穷要好,因为我认为您通常不会想要恐龙时代的日期。这将作为一个检查,以确保有人没有试图输入垃圾值。但是,如果您的问题只是假设性的,那么我不确定:)
      • 这个答案是最有用的——我坚持无限范围是因为它似乎应该是可能的——它可以用数字来完成,为什么不能用日期来完成——因为它会简化我的工作.我需要创建一组日期范围,然后“反转”在其他地方设置的日期范围(创建一组代表原始范围未涵盖的时间的范围)。从 100 年前开始的范围反转为从负无穷到 100 年前的范围。
      【解决方案4】:

      如果您有兴趣将时间范围传递给 ActiveRecord,因为您使用的是 Ruby on Rails,Time.new(Float::MAX)Time.new(-Float::MAX) 很有用。

      这是一个例子:

      def before(time)
        Time.new(-Float::MAX)..time
      end
      
      def after(time)
        time..Time.new(Float::MAX)
      end
      
      user.comments.where(created_at: before(user.subscribed_at))
      

      【讨论】:

        【解决方案5】:

        请注意,Ruby 2.6.x added(参见 cmets)无限范围,..Date.today 为今天之前的所有日期提供 .cover?(other_date) == true

        【讨论】:

        • 我正在使用 ruby​​ 2.6.6 并仍然得到相同的错误:(..Date.today).cover?(100.years.ago) 给了我syntax error, unexpected ..(nil..Date.today).cover?(100.years.ago) 给了我bad value for range。但是,ruby 2.7.3 提供了支持。
        猜你喜欢
        • 2018-02-12
        • 2019-05-16
        • 2016-10-14
        • 2017-04-01
        • 2011-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多