NavigableSet::lower
Ответ Keeg умно краток. Идея состоит в том, чтобы использовать метод lower
, определенный в интерфейсе NavigableSet
и реализованный в классе TreeSet
.
Но, как и в других ответах, он использует старые устаревшие классы даты и времени, включенные в самые ранние версии Java. Ниже обновленная версия с использованием java.time классов.
Старый вопрос и ответы используют либо java.util.Date
, который является моментом на временной шкале в UTC, представляющем как дату и время суток, либо java.sql.Date
, который неловко расширяет время использования. Дата, притворяясь, что у нее нет времени суток. Запутанный беспорядок.
java.time
Эти неприятные старые классы были вытеснены классами java.time , встроенными в Java 8 и более поздние версии. См. Oracle Tutorial . Большая часть функциональности была перенесена в Java 6 & 7 в ThreeTen-Backport и дополнительно адаптирована для Android в ThreeTenABP .
LocalDate
Класс LocalDate
представляет значение только для даты без времени суток и без часового пояса. Хотя эти объекты не хранят часовой пояс, обратите внимание, что часовой пояс (ZoneId
) имеет решающее значение при определении текущей даты. В любой момент времени дата меняется по всему земному шару в зависимости от часового пояса.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zoneId ); // 2016-06-25
ISO 8601
Подсказка: добавьте цифры месяца и дня месяца в начальный ноль. Это позволяет им соответствовать стандартным форматам даты и времени ISO 8601 . Эти форматы по умолчанию используются в java.time при разборе / генерации строк, представляющих значения даты и времени.
Поэтому используйте 2008-10-01
вместо 2008-10-1
. Если заполнение невозможно, выполните синтаксический анализ, используя DateTimeFormatter
.
NavigableSet dates = new TreeSet( 3 );
dates.add( LocalDate.parse( "2008-10-01" );
dates.add( LocalDate.parse( "2008-10-02" );
dates.add( LocalDate.parse( "2008-10-04" );
LocalDate target = LocalDate.parse( "2008-10-03" );
LocalDate hit = dates.lower( target );
// Reminder: test for `null == hit` to see if anything found.