Интервал LocalDate в Йода-время

Joda-time имеет класс Interval, который представляет собой диапазон между DateTime s. Что можно использовать для диапазона LocalDate s?

Я хочу объект, который представляет, например, "от 1/1/2011 до 10/1/2011", без времени (или времени), когда-либо появляющегося на картинке.

Насколько я вижу, у joda-time нет ничего для этого. Если для этого ничего не существует, и мы создадим его, как он будет выглядеть? Самое главное, что интерфейсы от joda-time могут быть реализованы для лучшей интеграции в другие типы, оставаясь в соответствии с дизайном joda-времени? Имеет ли смысл реализовать ReadableInterval, где getStart и getEnd return DateMidnight?

Ответ 1

Я использую Range класс из Guava.

Он поддерживает диапазоны с открытым концом. Также можно указать включенные или исключенные границы. Среди других многочисленных возможностей они позволяют легко представлять "до даты" или "после даты".

Пример для открытых интервалов.

Range<LocalDate> before2010 = Range.atMost(new LocalDate("2009-12-31"));
Range<LocalDate> alsoBefore2010 = Range.lessThan(new LocalDate("2010-01-01"));

Он также предлагает простые предикаты тестирования, такие как содержит и содержит ALL, и операцию пересечения. Все это проверено и поддерживается.

Ответ 2

Класс Interval представляет собой интервал времени от одного миллисекундного момента до другого момента (в комплекте с часовым поясом). DateMidnight - такой момент. Таким образом, предлагаемая вами реализация интервала для DateMidnights уже существует.

Interval i = new Interval(
    new DateMidnight(2010, 3, 2), new DateMidnight(2010, 3, 5));

i.contains(new DateTime(2010, 3, 1, 23, 59, 59, 999)); // == false
i.contains(new DateTime(2010, 3, 2, 0, 0, 0, 0)); // == true
i.contains(new DateTime(2010, 3, 4, 23, 59, 59, 999)); // == true
i.contains(new DateTime(2010, 3, 5, 0, 0, 0, 0)); // == false

Однако концепция вашего интервала поиска для LocalDates, а также Partial (без часовых поясов) еще не существует. Если вы собираетесь реализовать его для себя, не выполняйте никаких интерфейсов интервала. Это будет мешать вашим желаниям, потому что это, как указано ранее, основано на моментах.

Ответ 3

РЕДАКТИРОВАТЬ: Ой, неправильно прочитайте это раньше.

Нет, нет ничего эквивалентного в Joda Time, о котором я знаю.

Лично я бы просто создал свой собственный класс, который включал дату начала и окончания: LocalDateInterval или что-то в этом роде. Я бы не использовал повторно Interval для этого, так как это путало бы понятия: пара значений LocalDate не представляет двух моментов, поскольку локальная дата на самом деле не является мгновенным.

Лично я не считаю Interval особенно полезным в Joda Time... Я думал об удалении его из Noda Time. Теперь, похоже, я не должен;)

Ответ 4

Обратите внимание, что с помощью DateMidnight произойдет сбой при переключении DST. Лучше конвертировать с помощью date.toDateTimeAtStartOfDay().

Ответ 5

Мне также нужны интервалы объектов LocalDate, но он не поддерживается JodaTime. Поэтому мне пришлось создать свою собственную реализацию. Позже я решил немного отполировать его и сделать открытым исходным кодом.

Вы можете проверить это: https://github.com/serddmitry/joda-interval (доступно на Maven Central).

Ответ 6

public class LocalDateInterval {

   private LocalDate begin;
   private LocalDate end;

   public LocalDateInterval(LocalDate begin, LocalDate end) {
     this.begin = begin;
     this.end = end;
   }



}

Это работает для меня.