如何检查日期范围是否在Ruby中的另一个日期范围之间

时间:2018-06-19 07:55:21

标签: ruby-on-rails ruby

所以我的日期范围可能类似于((Date.today - 90)..Date.today),我想查看(Date.today - 90)是否在另一个日期范围的第一个值之后,Date.today是否在之前日期范围内的最终值。我已尝试过以下

((Date.parse('25-12-2000')..(Date.parse('25-12-2020')).include?((Date.today - 90)..Date.today)

返回false。如果我将include?替换为member?cover?

,我也会收到错误消息

我如何让它返回真实?语法改变还是我需要在Ruby中使用不同的方法?

3 个答案:

答案 0 :(得分:4)

您可以使用cover?检查日期范围是否包含两个值:

range = Date.new(2000, 12, 25)..Date.new(2020, 12, 25)

range.cover?(Date.today - 90) && range.cover?(Date.today)
#=> true

如果您有两个范围,请使用beginend

range = Date.new(2000, 12, 25)..Date.new(2020, 12, 25)
other = (Date.today - 90)..Date.today

range.cover?(other.begin) && range.cover?(other.end)
#=> true

答案 1 :(得分:1)

我只是检查范围的第一个和最后一个日期:

range = (Date.today - 90)..Date.today)
validation_range = ((Date.parse('25-12-2000')..(Date.parse('25-12-2020'))
range.first > validation_range && range.last < validation_range.last

你可以进一步分解,而不仅仅是每个的第一个和最后一个日期:

start_date = (Date.today - 90)
end_date = Date.today
start_validation = Date.parse('25-12-2000')
end_validation = Date.parse('25-12-2020')
start_date > start_validation && end_date < end_validation

我不确定命名的理想情况,如果你愿意,可以将其减少到一行,但希望这可以用于说明目的。此外,您可能希望使用>=<=,但我不确定日期是否包含在内。

这可以避免任何潜在的昂贵循环。

希望有所帮助 - 让我知道你是怎么过的,或者你有什么问题!

答案 2 :(得分:1)

如果您有两个范围A = (a..b)B = (y..z),并且想知道B是否完全涵盖了A,那么您可以询问:

a <= y && z <= b

无需预先构建范围。