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

249
27

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


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


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

спросил(а) 2021-01-19T15:58:20+03:00 9 месяцев назад
1
Решение
227

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


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


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

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

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

ответил(а) 2021-01-19T15:58:20+03:00 9 месяцев назад
176

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

ответил(а) 2021-01-19T15:58:20+03:00 9 месяцев назад
129

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


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


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


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

ответил(а) 2021-01-19T15:58:20+03:00 9 месяцев назад
102

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

ответил(а) 2021-01-19T15:58:20+03:00 9 месяцев назад
79

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


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

ответил(а) 2021-01-19T15:58:20+03:00 9 месяцев назад
65

public class LocalDateInterval {

private LocalDate begin;
private LocalDate end;

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

}


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

ответил(а) 2021-01-19T15:58:20+03:00 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема