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

244
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 6 месяцев, 1 неделя назад
1
Решение
223

Я использую 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 6 месяцев, 1 неделя назад
173

Класс 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 6 месяцев, 1 неделя назад
126

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


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


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


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

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

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

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

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


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

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

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 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

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