Интервал LocalDate в Joda-времени

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

Я хочу, чтобы объект представлял, например, "с 01.01.2011 по 01.10.2011", без учета времени (или часовых поясов).

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

6 ответов

Решение

Я лично использую класс Range из Гуавы.

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

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

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

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

Класс 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 aka a Partial (без часовых поясов) еще не существует. Если вы собираетесь реализовать это для себя, вообще не реализуйте никаких интервальных интерфейсов. Это будет мешать вашим пожеланиям, потому что, как уже говорилось, основано на моментах.

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

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

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

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

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

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

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

public class LocalDateInterval {

   private LocalDate begin;
   private LocalDate end;

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



}

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

Другие вопросы по тегам