Подтвердить что ты не робот

Приращение java.util.Date на один день

Каков правильный способ увеличения java.util.Date на один день.

Я думаю что-то вроде

        Calendar cal = Calendar.getInstance();
        cal.setTime(toDate);
        cal.add(Calendar.DATE, 1);
        toDate = cal.getTime();

Это не "правильно".

4b9b3361

Ответ 1

Это сработает.

Это не "правильно".

Если это многословие, которое вас беспокоит, добро пожаловать в API дат даты Java: -)

Ответ 2

Если вам не нравится математика в решении от 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

В 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, которые, безусловно, являются лучшим выбором для всех новых разработок.

Ответ 3

Да, это так. API Java Date часто ошибаются довольно часто. Я рекомендую вам попробовать Joda Time. Это будет что-то вроде:

DateTime startDate = ...
DateTime endDate = startDate.plusDays(1);

или

Instant start = ...
Instant end = start.plus(Days.days(1).toStandardDuration());

Ответ 4

Вот как я это делаю:

Date someDate = new Date(); // Or whatever    
Date dayAfter = new Date(someDate.getTime()+(24*60*60*1000));

Где математика в конце конвертирует день в секундах в миллисекундах.

Ответ 5

Если Java 8 или Joda Time не являются опцией, вы всегда можете выбрать Apache DateUtils:

DateUtils.addDays(myDate, 1);

Ответ 6

Я верю joda time библиотека делает ее намного более чистой для работы с датами.

Ответ 7

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 ));

Ответ 8

Я помогаю современным ответом.

Это не "чувствует" правильно.

Мое предположение состоит в том, что, почему это не чувствует себя правильным, потому что это так многословно. Добавление одного дня к дате концептуально является простым делом и должно иметь простое представление в вашей программе. Проблема здесь заключается в плохом дизайне класса 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.