Увеличение java.util.Date на один день - PullRequest
21 голосов
/ 28 сентября 2010

Как правильно увеличить java.util.Date на один день.

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

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

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

Ответы [ 8 ]

19 голосов
/ 28 сентября 2010

Это будет работать.

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

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

18 голосов
/ 28 сентября 2010

Если вам не нравится математика в решении от Тони Энниса

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

11 голосов
/ 28 сентября 2010

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

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

или:

Instant start = ...
Instant end = start.plus(Days.days(1).toStandardDuration());
9 голосов
/ 28 сентября 2010

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

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

Где математика в конце преобразует значение дня в секундах в миллисекунды.

3 голосов
/ 31 мая 2017

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

DateUtils.addDays(myDate, 1);
1 голос
/ 28 сентября 2010

Мне кажется, joda time библиотека делает работу с датами намного более чистой.

0 голосов
/ 26 июня 2019

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

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

Мое предположение заключается в том, что почему-то это не так, потому что это так многословно. Добавление одного дня к дате концептуально является простым делом и должно иметь простое представление в вашей программе. Проблема здесь заключается в плохом дизайне класса Calendar: когда вы используете его, ваш код должен быть таким многословным. И вы правы: вы должны не использовать плохо спроектированный класс Calendar. Это давно устарело. Используя java.time, современный Java-API даты и времени, добавить один день просто, также в коде:

    LocalDate toDate = LocalDate.of(2020, Month.FEBRUARY, 28);
    LocalDate nextDate = toDate.plusDays(1);
    System.out.println("Incremented date is " + nextDate);

Вывод:

Инкрементная дата 2020-02-29

Если вам нужен тип, отличный от LocalDate, другие классы java.time также имеют метод plusDays, который вы можете использовать таким же образом, как уже показано в ответе Ивина.

Ссылки

0 голосов
/ 26 июня 2019
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 ));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...