Elimizde iki tarih aralığı olsun. Bu tarih aralıklarının kesişip kesişmediğini veren yöntem aşağıdaki gibi yapılabilir:
public static boolean overlap(Date start1, Date end1,
Date start2, Date end2) {
return (end2 == null || start1 == null || !start1.after(end2))
&& (end1 == null || start2 == null || !end1.before(start2));
}
Herhangi bir alan null verilirse de kod çalışır. Eğer tüm alanlar null verilirse yöntem true döndürür.
Yöntemi DateUtil sınıfına statik bir yöntem olarak ekleyip aşağıdaki gibi test kodu yazıp test edebilirsiniz:
@Test
public void testOverlap() {
Date date1=new Date(2018, 1, 1);
Date date2=new Date(2018, 1, 10);
Date date3=new Date(2018, 2, 1);
Date date4=new Date(2018, 2, 10);
assertFalse(DateUtil.overlap(date1, date2, date3, date4));
Date date5=new Date(2017, 1, 1);
Date date6=new Date(2017, 1, 10);
assertFalse(DateUtil.overlap(date1, date2, date5, date6));
Date date7=new Date(2017, 1, 1);
Date date8=new Date(2018, 1, 1);
assertTrue(DateUtil.overlap(date1, date2, date7, date8));
Date date9=new Date(2017, 1, 1);
Date date10=new Date(2018, 1, 5);
assertTrue(DateUtil.overlap(date1, date2, date9, date10));
Date date11=new Date(2017, 1, 10);
Date date12=new Date(2018, 1, 12);
assertTrue(DateUtil.overlap(date1, date2, date11, date12));
// no end
Date date13=new Date(2018, 1, 10);
assertTrue(DateUtil.overlap(date1, date2, date13, null));
// no start
Date date14=new Date(2018, 1, 1);
assertTrue(DateUtil.overlap(date1, date2, null, date14));
// no end no overlap
Date date15=new Date(2018, 1, 11);
assertFalse(DateUtil.overlap(date1, date2, date15, null));
// no start no overlap
Date date16=new Date(2017, 12, 31);
assertFalse(DateUtil.overlap(date1, date2, null, date16));
// all null
assertTrue(DateUtil.overlap(null, null, null, null));
}