Интервал LocalDate в Joda-времени - PullRequest
29 голосов
/ 08 декабря 2010

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

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

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

Ответы [ 6 ]

27 голосов
/ 06 мая 2014

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

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

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

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

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

14 голосов
/ 08 декабря 2010

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

7 голосов
/ 08 декабря 2010

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

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

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

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

4 голосов
/ 30 октября 2012

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

2 голосов
/ 21 февраля 2013

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

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

1 голос
/ 14 июня 2017
public class LocalDateInterval {

   private LocalDate begin;
   private LocalDate end;

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



}

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

...