Ruby:两个范围之间的交集

标签 ruby date range

在 ruby​​ 中,给定两个日期范围,我想要表示两个日期范围交集的范围,如果没有交集则为 nil。例如:

(Date.new(2011,1,1)..Date.new(2011,1,15)) & (Date.new(2011,1,10)..Date.new(2011,2,15))
=> Mon, 10 Jan 2011..Sat, 15 Jan 2011

编辑:应该说我希望它也适用于 DateTime,因此间隔可以减少到分钟和秒:

(DateTime.new(2011,1,1,22,45)..Date.new(2011,2,15)) & (Date.new(2011,1,1)..Date.new(2011,2,15))
=> Sat, 01 Jan 2011 22:45:00 +0000..Tue, 15 Feb 2011

最佳答案

require 'date'

class Range
  def intersection(other)
    return nil if (self.max < other.begin or other.max < self.begin) 
    [self.begin, other.begin].max..[self.max, other.max].min
  end
  alias_method :&, :intersection
end

p (Date.new(2011,1,1)..Date.new(2011,1,15)) & (Date.new(2011,1,10)..Date.new(2011,2,15))
#<Date: 2011-01-10 ((2455572j,0s,0n),+0s,2299161j)>..#<Date: 2011-01-15 ((2455577j,0s,0n),+0s,2299161j)>

关于Ruby:两个范围之间的交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8414547/

相关文章:

ruby-on-rails - 遵循 Rails 教程并且语法错误导致测试无法通过

ruby - Shotgun 未使用适当的 ruby​​ 版本 (macosx)

c# - 什么是折叠一组潜在重叠范围的通用算法?

c# - 在 Windows C# 中查找列中最后使用的行

ruby - 包含 ruby​​ 模块层次结构的一部分

mysql - 如何通过在 Ruby Rails 平台上运行 sql 脚本来为 mysql 数据库做种?

java - 如何从字符串中获取日期对象

javascript - JavaScript 中的日期问题

c++ - 将 YYMMDD 转换为 YYYYMMDD 并对它们进行排序

sql - 给定一列有效日期,是否有 SQL 语句可以将其转换为日期范围?