Ответ 1
Это сработает.
Это не "правильно".
Если это многословие, которое вас беспокоит, добро пожаловать в API дат даты Java: -)
Каков правильный способ увеличения java.util.Date на один день.
Я думаю что-то вроде
Calendar cal = Calendar.getInstance();
cal.setTime(toDate);
cal.add(Calendar.DATE, 1);
toDate = cal.getTime();
Это не "правильно".
Это сработает.
Это не "правильно".
Если это многословие, которое вас беспокоит, добро пожаловать в API дат даты Java: -)
Если вам не нравится математика в решении от Tony Ennis
Date someDate = new Date(); // Or whatever
Date dayAfter = new Date(someDate.getTime() + TimeUnit.DAYS.toMillis( 1 ));
Но более или менее с тех пор, как я нашел этот Q/A, я использовал JodaTime вместо этого и недавно переключился на новую DateTime в Java 8 (который вдохновлен, но не скопирован из Joda), спасибо @BasilBourqueless за указание на это).
В Java 8 почти все классы, основанные на времени, имеют метод .plusDays(), делающий эту задачу тривиальной:
LocalDateTime.now() .plusDays(1);
LocalDate.now() .plusDays(1);
ZonedDateTime.now() .plusDays(1);
Duration.ofDays(1) .plusDays(1);
Period.ofYears(1) .plusDays(1);
OffsetTime.now() .plus(1, ChronoUnit.DAYS);
OffsetDateTime.now() .plus(1, ChronoUnit.DAYS);
Instant.now() .plus(1, ChronoUnit.DAYS);
Java 8 также добавила классы и методы для взаимодействия между (ныне) устаревшей датой и календарем и т.д. и новыми классами DateTime, которые, безусловно, являются лучшим выбором для всех новых разработок.
Да, это так. API Java Date часто ошибаются довольно часто. Я рекомендую вам попробовать Joda Time. Это будет что-то вроде:
DateTime startDate = ...
DateTime endDate = startDate.plusDays(1);
или
Instant start = ...
Instant end = start.plus(Days.days(1).toStandardDuration());
Вот как я это делаю:
Date someDate = new Date(); // Or whatever
Date dayAfter = new Date(someDate.getTime()+(24*60*60*1000));
Где математика в конце конвертирует день в секундах в миллисекундах.
Если Java 8 или Joda Time не являются опцией, вы всегда можете выбрать Apache DateUtils:
DateUtils.addDays(myDate, 1);
Я верю joda time библиотека делает ее намного более чистой для работы с датами.
Date thisDate = new Date(System.currentTimeMillis());
Date dayAfter = new Date(thisDate.getTime() + TimeUnit.DAYS.toMillis( 1 ));
Date dayBefore = new Date(thisDate.getTime() + TimeUnit.DAYS.toMillis( -1 ));
Я помогаю современным ответом.
Это не "чувствует" правильно.
Мое предположение состоит в том, что, почему это не чувствует себя правильным, потому что это так многословно. Добавление одного дня к дате концептуально является простым делом и должно иметь простое представление в вашей программе. Проблема здесь заключается в плохом дизайне класса Calendar
: когда вы используете его, ваш код должен быть таким многословным. И вы правы: вы не должны использовать плохо разработанный класс Calendar
. Это давно устарело. Используя java.time, современный API даты и времени Java, добавить один день просто, также в коде:
LocalDate toDate = LocalDate.of(2020, Month.FEBRUARY, 28);
LocalDate nextDate = toDate.plusDays(1);
System.out.println("Incremented date is " + nextDate);
Выход:
Дата увеличения 2020-02-29
Ссылка: Oracle, учебник: Дата и время, объясняющие, как использовать java.time.