tl;dr
Чтобы перейти от одной даты к другой, добавляя/вычитая количество дней.
LocalDate.now(
ZoneId.of( "Pacific/Auckland" )
)
.minusDays( 5 )
Для расчета количества дней, месяцев и лет, прошедших между двумя датами.
Period.between( start , stop )
Разбор
Сначала вы должны проанализировать ваши строковые входы в объекты даты и времени. Затем вы работаете над предварительным формированием своей бизнес-логики с этими объектами.
Перестаньте думать о значениях даты и времени как о строках, это сведет вас с ума. Мы работаем с объектами даты и времени в нашем коде; мы обмениваемся данными с пользователями или другими приложениями, используя строковое представление этого объекта даты и времени.
В Java 8 и более поздних версиях используйте java.time структура. См. учебник.
Вам нужна только дата без времени суток, поэтому мы можем использовать ссылку LocalDate
класс.
Этот причудливый синтаксис с двойным двоеточием — это ссылка на метод, способ чтобы сказать, какой метод должен быть вызван другим кодом.
String input = "2015 01 02";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "yyyy MM dd" );
LocalDate localDate = formatter.parse ( input , LocalDate :: from );
Текущая дата
Для определения сегодняшней даты требуется часовой пояс. В любой момент дата варьируется по всему земному шару в зависимости от зоны.
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
LocalDate todayTunis = LocalDate.now( z ) ;
Если вам нужен текущий часовой пояс JVM по умолчанию, вызовите ZoneId.systemDefault
.
Вычитание дат
Это уже неоднократно обсуждалось на StackOveflow.com. Например, Как вычесть X дней из даты с помощью календаря Java?. Подробнее см. в других ответах, таких как этот мой и этот я для более подробной информации. Совет: «истекшее» — ключевое слово для поиска.
Вкратце, используйте Period
для определения числа стандартных дней, месяцев и лет.
LocalDate weekLater = localDate.plusDays ( 7 );
Period period = Period.between ( localDate , weekLater );
Integer daysElapsed = period.getDays ();
Дамп на консоль.
System.out.println ( "localDate: " + localDate + " to " + weekLater + " in days: " + daysElapsed );
localDate: 2015-01-02 по 2015-01-09 в днях: 7
Обратите внимание на ограничение, что Period
работает только с целыми днями, то есть со значениями только даты без времени дня. Это то, что нам нужно здесь для этого Вопроса, так что работа сделана. Если у вас есть значения даты и времени (объекты ZonedDateTime
), используйте класс Days
проекта ThreeTen-Extra. как указано в связанном вопросе/ответе выше.
person
Basil Bourque
schedule
04.11.2015