Як я можу збільшити побачення на один день на Java?


561

Я працюю з датою в такому форматі: yyyy-mm-dd.

Як я можу збільшити цю дату за один день?


10
Якщо ви використовуєте Java 8 або новішу версію, ви можете використовувати новий api дата / час. Дивіться цю відповідь: stackoverflow.com/a/23910924/1115554
micha

4
новий DateTime (). plusDays (1) .toDate () ???
П'єтро

Відповіді:


684

Щось подібне повинно зробити трюк:

String dt = "2008-01-01";  // Start date
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
c.setTime(sdf.parse(dt));
c.add(Calendar.DATE, 1);  // number of days to add
dt = sdf.format(c.getTime());  // dt is now the new date

50
@Esko, c.roll (Календар.DATE, правда) не відображатиметься місяця в останній день місяця.
Сем Хаслер

18
@Ammar, це погана ідея, якщо ти нічого не зрозумів
niccolo m.

13
Я цитую деякі JavaDocs ... Calendar.DATE: "... Це синонім DAY_OF_MONTH." Я хотів би, щоб JavaDocs уточнив, що це збільшить великі поля (наприклад, місяць і рік). Calendar.roll "Додає або віднімає (вгору / вниз) одну одиницю часу у заданому часовому полі без зміни великих полів". Знову ж таки, "більші поля" є невиразними, але це, здається, відповідає коментарям Сема. Я хотів би, щоб був StackOverflow для виправлення старих JavaDocs.
jcalfee314

4
хлопці, на жаль, марно додавати дні за допомогою DATE, DAY_OF_MONTH або навіть DAY_OF_YEAR - всі вони збільшуються за модулем. Отже, враховуючи Календар 31-12-1970, додайте (DAY_OF_YEAR, 1) або roll (), проте roll () нарешті дзвонить, add (), дасть 01-01-1970. Я думаю, єдиний правильний спосіб - це встановити час з мілісекундами. Щодо мене, я більше ніколи не користуюся класом Календар.
Дмитро Грязін

14
@Bagzerg: Ви помиляєтесь . add()передасть дату. Дивіться на ideone .
Жан Хомінал

211

Java, схоже, значно відстає від восьмигральної кулі порівняно з C #. Цей утилітний метод показує спосіб зробити в Java SE 6 за допомогою методу Calendar.add (мабуть, єдиний простий спосіб).

public class DateUtil
{
    public static Date addDays(Date date, int days)
    {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DATE, days); //minus number would decrement the days
        return cal.getTime();
    }
}

Щоб додати один день за запитанням, зателефонуйте так:

String sourceDate = "2012-02-29";
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date myDate = format.parse(sourceDate);
myDate = DateUtil.addDays(myDate, 1);

4
FYI, жахливі старі класи дату, такі як java.util.Date, java.util.Calendarі java.text.SimpleDateFormatтепер застарілі , витіснені класами java.time, вбудованими в Java 8 та новіших версій. Дивіться Підручник від Oracle .
Василь Бурк

79

java.time

На Java 8 і новіших версіях пакет java.time робить це майже автоматичним. ( Підручник )

Припускаючи Stringвхід і вихід:

import java.time.LocalDate;

public class DateIncrementer {
  static public String addOneDay(String date) {
    return LocalDate.parse(date).plusDays(1).toString();
  }
}

3
FYI, і те, ZonedDateDateTimeі OffsetDateTimeє, plusDaysі minusDaysметоди, а такожLocalDate
Василь Бурк

@BasilBourque Звичайно, але інформація, наявна у питанні, - це інформація про LocalDate.
Даніель К. Собрал

2
@DanielCSobral Yep. Просто додавання посилань для повчання читачів. Не критика.
Василь Бурк

65

Я вважаю за краще використовувати DateUtils від Apache. Перевірте це http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/time/DateUtils.html . Це зручно, особливо коли вам доведеться використовувати його у кількох місцях у своєму проекті, і ви не хочете писати для цього свій метод одного вкладиша.

API говорить:

addDays (дата, дата): додає кількість днів до дати повернення нового об'єкта.

Зауважте, що він повертає новий об'єкт Date і не вносить зміни до попереднього.


59
SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd" );
Calendar cal = Calendar.getInstance();
cal.setTime( dateFormat.parse( inputString ) );
cal.add( Calendar.DATE, 1 );


43

Погляньте на Joda-Time ( https://www.joda.org/joda-time/ ).

DateTimeFormatter parser = ISODateTimeFormat.date();

DateTime date = parser.parseDateTime(dateString);

String nextDay = parser.print(date.plusDays(1));

3
Ви можете видалити виклики аналізатора для побудови DateTime. Використовуйте DateTime date = новий DateTime (dateString); Тоді nextDay - ISODateTimeFormat.date (). Print (date.plusDays (1)); Див. Joda-time.sourceforge.net/api-release/org/joda/time/… для отримання додаткової інформації.
MetroidFan2002

Більш детальний приклад коду, що використовує Joda-Time, дивіться мою відповідь на аналогічне запитання: Як додати один день до побачення? .
Василь Бурк

2
FYI… Проект Joda-Time зараз перебуває в режимі обслуговування та радить переходити до класів java.time . Обидва зусилля очолив той самий чоловік, Стівен Колбурн. Тому вони поділяють подібні поняття, і міграція не є складною.
Василь Бурк

40

Зверніть увагу, що ця лінія додає 24 години:

d1.getTime() + 1 * 24 * 60 * 60 * 1000

але ця лінія додає один день

cal.add( Calendar.DATE, 1 );

У дні зі зміною літнього часу (25 або 23 години) ви отримаєте різні результати!


40

Java 8 додала новий API для роботи з датами та часом.

З Java 8 ви можете використовувати такі рядки коду:

// parse date from yyyy-mm-dd pattern
LocalDate januaryFirst = LocalDate.parse("2014-01-01");

// add one day
LocalDate januarySecond = januaryFirst.plusDays(1);

1
Я думаю, ти januaryFirst.plusDays(1)не мав на увазі цього date.plusDays(1).
TeWu

Це підтримується лише на android O developer.android.com/reference/java/time/package-summary.html
Subho

1
@Subho Для Android до 26 дивіться проект ThreeTenABP, який адаптує проект ThreeTen-Backport , зворотний порт, якщо більшість функцій Java-часу для Java 6 та Java 7.
Basil Bourque

29

ви можете використовувати Simple java.util lib

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

1
Ця відповідь дублює зміст декількох відповідей, включаючи прийнятий відповідь від трьох років тому. Видаліть свою відповідь або відредагуйте, щоб додати вартість.
Василь Бурк

3
ця відповідь чистіша, не розбирайте дату посередині. "прийнята відповідь" занадто суперечлива. добре, що ви додали своє, ігноруйте автоматичне зауваження базиліка
Міккі Перлштайн

FYI, жахливі старі класи дату, такі як java.util.Date, java.util.Calendarі java.text.SimpleDateFormatтепер застарілі , витіснені класами java.time, вбудованими в Java 8 та новіших версій. Дивіться Підручник від Oracle .
Василь Бурк

Найкраща відповідь, прямо до суті. Я згоден з Міккі, просто
ігноруй

23
Date today = new Date();               
SimpleDateFormat formattedDate = new SimpleDateFormat("yyyyMMdd");            
Calendar c = Calendar.getInstance();        
c.add(Calendar.DATE, 1);  // number of days to add      
String tomorrow = (String)(formattedDate.format(c.getTime()));
System.out.println("Tomorrows date is " + tomorrow);

Це дасть завтрашній день. c.add(...)параметри можуть бути змінені з 1 на інше число для відповідного збільшення.


1
ви можете зробити щось на зразок c.setTime (об’єкт дати), щоб встановити конкретну дату перед додаванням.
Лін Ліно

Я хотів би, щоб пакети Java за замовчуванням зробили дати переробки менш заплутаними ... Я маю на увазі, це такий біль щоразу, коли хочеться мати справу з датами ... просто
розпуста

1
@Shn_Android_Dev Класи java.time, вбудовані в Java 8, і пізніше витісняють страшні старі класи часу та відповідають на ваше бажання. Також підключений до Java 6/7 та новіших Android у проектах ThreeTen-Backport та ThreeTenABP . Не потрібно ніколи використовувати, Dateні Calendarзнову.
Василь Бурк

19

Якщо ви використовуєте Java 8 , то зробіть це так.

LocalDate sourceDate = LocalDate.of(2017, Month.MAY, 27);  // Source Date
LocalDate destDate = sourceDate.plusDays(1); // Adding a day to source date.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); // Setting date format

String destDate = destDate.format(formatter));  // End date

Якщо ви хочете використовувати SimpleDateFormat , зробіть це так.

String sourceDate = "2017-05-27";  // Start date

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

Calendar calendar = Calendar.getInstance();
calendar.setTime(sdf.parse(sourceDate)); // parsed date and setting to calendar

calendar.add(Calendar.DATE, 1);  // number of days to add
String destDate = sdf.format(calendar.getTime());  // End date

Ні, у запитанні було вказано значення лише для дати, а не дата. Тому використовуйте LocalDateклас не LocalDateTime.
Василь Бурк

1
Ваша відповідь повторює зміст принаймні чотирьох інших відповідей. Будь ласка, поясніть, як ваша додає цінність понад ці, або ж видаліть, перш ніж збирати голоси.
Василь Бурк

16
long timeadj = 24*60*60*1000;
Date newDate = new Date (oldDate.getTime ()+timeadj);

Це займає кількість мілісекунд, починаючи з епохи від oldDate, і додає мілісекунд на 1 день, потім використовує загально конструктор Date () для створення дати, використовуючи нове значення. Цей метод дозволяє додавати 1 день або будь-яку кількість годин / хвилин, а не лише цілі дні.


Це, мабуть, не те, чого хотів ОП; він не передбачає жодних пристосувань для коригування типу літнього часу, стрибкових секунд тощо.
mrec

1
Економія денного світла повинна оброблятися за часовим поясом / місцем. Мій приклад показав, як збільшувати невеликі тривалості. При збільшенні по днях стрибкові секунди можуть бути проблемою, але при додаванні годин, це менш ймовірно, хоча все ж можливо.
двадцять

15

Оскільки Java 1.5 TimeUnit.DAYS.toMillis (1) мені виглядає більш чистою.

SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd" );
Date day = dateFormat.parse(string);
// add the day
Date dayAfter = new Date(day.getTime() + TimeUnit.DAYS.toMillis(1));

Це створює значення дати та часу, коли питання запитує лише дату. Я пропоную набагато мудріший підхід - це LocalDateклас у класах java.time для Java 8 та новіших версій, а також зворотний порт для Java 6 та Java 7, знайдений у проекті ThreeTen-Backport .
Василь Бурк


11

У java 8 можна використовувати java.time.LocalDate

LocalDate parsedDate = LocalDate.parse("2015-10-30"); //Parse date from String
LocalDate addedDate = parsedDate.plusDays(1);   //Add one to the day field

Ви можете перетворити в java.util.Dateоб'єкт наступним чином.

Date date = Date.from(addedDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

Ви можете сформулювати LocalDateв String наступним чином.

String str = addedDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));

11

Це дуже просто, намагаючись пояснити простим словом. отримати сьогоднішню дату, як показано нижче

Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime());// print today's date
calendar.add(Calendar.DATE, 1);

Тепер встановіть на один день попереду цю дату методом Calendar.add, який приймає (константа, значення). Тут константа може бути DATE, годин, хв, сек і т.д., а значення - значення постійної. Як і на один день, постійна константа вперед - Calendar.DATE, і її значення дорівнює 1, тому що ми хочемо значення на один день вперед.

System.out.println(calendar.getTime());// print modified date which is завтрашня дата

Дякую



7

Просто передайте дату в рядку та кількість наступних днів

 private String getNextDate(String givenDate,int noOfDays) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance();
        String nextDaysDate = null;
    try {
        cal.setTime(dateFormat.parse(givenDate));
        cal.add(Calendar.DATE, noOfDays);

       nextDaysDate = dateFormat.format(cal.getTime());

    } catch (ParseException ex) {
        Logger.getLogger(GR_TravelRepublic.class.getName()).log(Level.SEVERE, null, ex);
    }finally{
    dateFormat = null;
    cal = null;
    }

    return nextDaysDate;

}

7

Якщо ви хочете додати одну одиницю часу, і очікуєте, що також будуть збільшені й інші поля, можете сміливо використовувати метод додавання. Дивіться приклад нижче:

SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
cal.set(1970,Calendar.DECEMBER,31);
System.out.println(simpleDateFormat1.format(cal.getTime()));
cal.add(Calendar.DATE, 1);
System.out.println(simpleDateFormat1.format(cal.getTime()));
cal.add(Calendar.DATE, -1);
System.out.println(simpleDateFormat1.format(cal.getTime()));

Буде надруковано:

1970-12-31
1971-01-01
1970-12-31

Немає прийнятої відповіді, і я вважав, що загальна плутанина, якщо інші поля також будуть оновлені.
терміт

7
startCalendar.add(Calendar.DATE, 1); //Add 1 Day to the current Calender

4
Дякуємо, що хочете зробити свій внесок. Однак це вже є в декількох інших відповідях, тому я справді не бачу сенсу ... Крім того, що ІМХО ніхто не повинен використовувати погано розроблений і давно застарілий Calendarклас у 2019 році.
Оле В. В.

6

Якщо ви використовуєте Java SE 8 або новішої версії, ви повинні використовувати новий API Дата / Час

 int days = 7;       
 LocalDate dateRedeemed = LocalDate.now();
 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/YYYY");

 String newDate = dateRedeemed.plusDays(days).format(formatter);   
 System.out.println(newDate);

Якщо вам необхідно конвертувати java.util.Dateв java.time.LocalDate, ви могли б використовувати цей метод.

  public LocalDate asLocalDate(Date date) {
      Instant instant = date.toInstant();
      ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
      return zdt.toLocalDate();
  }

Якщо ви використовуєте версію до Java SE 8, я раджу використовувати Joda-Time

Joda-Time забезпечує якісну заміну для класів дати та часу Java та є фактично стандартною бібліотекою дати та часу для Java до Java SE 8

   int days = 7;       
   DateTime dateRedeemed = DateTime.now();
   DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/uuuu");

   String newDate = dateRedeemed.plusDays(days).toString(formatter);   
   System.out.println(newDate);

1
Ваш шаблон для java.timeчастини невірний. Він повинен бути dd/MM/uuuuеквівалентним JodaTime.
TiiJ7

5

Використовуйте DateFormatAPI для перетворення рядка в об’єкт дати, а потім використовуйте CalendarAPI, щоб додати один день. Повідомте мене, якщо ви хочете конкретних прикладів коду, і я можу оновити свою відповідь.


3

Якщо ви використовуєте Java 8, java.time.LocalDateі це java.time.format.DateTimeFormatterможе зробити цю роботу досить простою.

public String nextDate(String date){
      LocalDate parsedDate = LocalDate.parse(date);
      LocalDate addedDate = parsedDate.plusDays(1);
      DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-mm-dd");
      return addedDate.format(formatter); 
}

Ще простіше: киньте формат і просто використовуйте toString()для створення рядка і yyyy-MM-dd формат (і якщо ви наполягаєте, пам’ятайте, що mmце хвилини, поки MMє місяць).
Оле ВВ

3

Ви можете використовувати цей пакет із "org.apache.commons.lang3.time":

 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
 Date myNewDate = DateUtils.addDays(myDate, 4);
 Date yesterday = DateUtils.addDays(myDate, -1);
 String formatedDate = sdf.format(myNewDate);  

5
Пропонувати Dateклас у 2018 році - це погана порада. Смутні старі класи дату, такі як java.util.Date, java.util.Calendarі java.text.SimpleDateFormatтепер застарілі , замінені класами java.time, вбудованими в Java 8 та Java 9. Див. Підручник від Oracle . Дивіться інші відповіді за допомогою LocalDateкласу.
Василь Бурк

Так, LocalDate - це найкращий спосіб зробити це,
Shaheed,

однак деякі рамки, такі як jsf, мають невеликі проблеми інтеграції з API часу, тому іноді слід використовувати Date; плюс середовище java <8
Lucke

1
@Lucke Більшість функцій java.time було перенесено на Java 6 і 7 у проекті ThreeTen-Backport . Далі адаптований до старих Android у проекті ThreeTenABP . Тож справді не потрібно ніколи торкатися цих кривавих жахливих давніх занять. Багато рамок було оновлено. Але не всі. Отже, якщо вам потрібно взаємодіяти зі старим кодом, ще не оновленим до java.time , напишіть новий код у java.time та перетворіть на / зі старих типів, викликаючи нові методи перетворення, додані до старих класів.
Василь Бурк

1
Цей код ігнорує вирішальну проблему часового поясу . Для будь-якого моменту дата змінюється по всьому світу за зоною. SimpleDateFormatКлас , до жаль , впорскує часовий пояс, неявно застосовуючи поточну зону в JVM за замовчуванням. Таким чином, результати цього коду будуть змінюватися залежно від поточного за замовчуванням - і цей стандарт може змінитися в будь-який момент під час виконання.
Василь Бурк

3

Насправді це просто. Один день містить 86400000 мілісекунд. Отже, спочатку ви отримуєте поточний час у міліметрах від Системи, використовуючи System.currentTimeMillis()потім додайте 84000000 мілісекунд і використовуйте DateКлас для створення формату дати протягом мілісекунд.

Приклад

String Today = new Date(System.currentTimeMillis()).toString();

Рядок сьогодні буде 2019-05-9

String Tommorow = new Date(System.currentTimeMillis() + 86400000).toString();

String Tommorow буде 2019-05-10

String DayAfterTommorow = new Date(System.currentTimeMillis() + (2 * 86400000)).toString();

String DayAfterTommorow буде 2019-05-11


Цей код використовує жахливий Dateклас, який витіснили роки тому сучасні класи java.time . Настільки простіше простого використання:LocalDate.parse( "2019-01-23" ).plusDays( 1 )
Василь Бурк

2

Давайте уточнимо випадок використання: Ви хочете виконати арифметику календаря та почати / закінчити з java.util.Date .

Деякі підходи:

  1. Перетворити на рядок і назад за допомогою SimpleDateFormat : це неефективне рішення.
  2. Перетворити в LocalDate : Ви втратили б інформацію про час доби.
  3. Перетворити в LocalDateTime : це включає більше кроків, і вам потрібно турбуватися про часовий пояс.
  4. Перетворити в епоху з Date.getTime () : Це ефективно, але ви обчислюєте з мілісекундами.

Подумайте про використання java.time.Instant :

Date _now = new Date();
Instant _instant = _now.toInstant().minus(5, ChronoUnit.DAYS);
Date _newDate = Date.from(_instant);

1
Ніколи не змішуйте жахливі старі класи, наприклад, Dateіз сучасними класами java.time, такими як Instant. У java.time класи повністю витісняти застарілі класи. Зокрема, Instantзамінює java.util.Date.
Василь Бурк

1
Не стосується питання. Ви використовуєте класи, що представляють момент (дату з часом дня в контексті зміщення чи зони). Але Питання задає питання про дату лише без часу дня та без часового поясу. Див. Правильну відповідь Собрала та правильну відповідь micha.
Василь Бурк

0
Date newDate = new Date();
newDate.setDate(newDate.getDate()+1);
System.out.println(newDate);

14
fyi, Date.setDate () застаріло
Kelly S. Французька

На моєму комп’ютері, здається, він працює через місяць. Після Sun Apr 30 16:25:33 CEST 2017приходить Mon May 01 16:25:33 CEST 2017. Це все ж відсторонено рішення. Метод не тільки є застарілим з поважної причини, також у 2017 році у нас є дуже хороші альтернативи Dateкласу.
Оле ВВ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.