There are various interval type modules on CPAN. By converting all your dates to epoch seconds and using Number::Interval, one could check to see whether the ranges overlap.
To prepare a schedule you could use an iCal compliant application then convert the output to intervals. This could be done with Net::ICal as suggested above or Tie::iCal with Date::ICal.