I personnaly use the Range class from Guava.
It supports open ended ranges. It is also possible to specify included or excluded bounds. Among other numerous possibilities, those allow to easily represent “before a date” or “after a date”.
Example for open-ended intervals.
Range<LocalDate> before2010 = Range.atMost(new LocalDate("2009-12-31"));
Range<LocalDate> alsoBefore2010 = Range.lessThan(new LocalDate("2010-01-01"));
It also offerts easy testing predicates, like contains and containsAll, and an intersection operation. All this tested and maintained.