Ruby:两个范围之间的交集

在ruby中,给定两个日期范围,我想要表示两个日期范围的交集的范围,如果没有交点,则为零.例如:
(Date.new(2011,1,1)..Date.new(2011,15)) & (Date.new(2011,10)..Date.new(2011,2,15))
=> Mon,10 Jan 2011..Sat,15 Jan 2011

编辑:应该说我希望它适用于DateTime,所以间隔可以缩短到mins和secs:

(DateTime.new(2011,22,45)..Date.new(2011,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,15))
#<Date: 2011-01-10 ((2455572j,0s,0n),+0s,2299161j)>..#<Date: 2011-01-15 ((2455577j,2299161j)>

相关文章

以下代码导致我的问题: class Foo def initialize(n=0) @n = n end attr_accessor :n d...
这是我的spec文件,当为上下文添加测试“而不是可单独更新用户余额”时,我得到以下错误. require 's...
我有一个拦截器:DevelopmentMailInterceptor和一个启动拦截器的inititializer setup_mail.rb. 但我想将...
例如,如果我有YAML文件 en: questions: new: 'New Question' other: recent: ...
我听说在RSpec中避免它,let,let !,指定,之前和主题是最佳做法. 关于让,让!之前,如果不使用这些,我该如...
我在Rails中使用MongoDB和mongo_mapper gem,项目足够大.有什么办法可以将数据从Mongoid迁移到 Postgres...