Как я могу увеличить дату на один день в Java?

Я работаю с датой в этом формате: yyyy-mm-dd,

Как я могу увеличить эту дату на один день?

33 ответа

Нечто подобное должно сработать:

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

Похоже, что 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);

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

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

API говорит:

addDays (Date date, int amount): Добавляет количество дней к дате, возвращая новый объект.

Обратите внимание, что он возвращает новый объект Date и не вносит изменений в сам предыдущий.

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

Создайте объект Calendar и используйте метод add(Calendar.DATE, 1);

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

Посмотрите на Joda-Time ( https://www.joda.org/joda-time/).

DateTimeFormatter parser = ISODateTimeFormat.date();

DateTime date = parser.parseDateTime(dateString);

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

Обратите внимание, что эта строка добавляет 24 часа:

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

но эта строка добавляет один день

cal.add( Calendar.DATE, 1 );

В дни с переходом на летнее время (25 или 23 часа) вы получите разные результаты!

Вы можете использовать Simple java.util lib

Calendar cal = Calendar.getInstance(); 
cal.setTime(yourDate); 
cal.add(Calendar.DATE, 1);
yourDate = cal.getTime();
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 на другое число для соответствующего приращения.

Если вы используете 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

Начиная с 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));
long timeadj = 24*60*60*1000;
Date newDate = new Date (oldDate.getTime ()+timeadj);

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

В Java 8 простой способ сделать это:

Date.from(Instant.now().plusSeconds(SECONDS_PER_DAY))

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

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

Теперь установите эту дату на один день вперед с помощью метода calendar.add, который принимает (константа, значение). Здесь константа может быть ДАТА, часы, минуты, секунды и т. Д., А значение - это значение константы. Как и на один день, константа впереди - Calendar.DATE, а ее значение равно 1, потому что мы хотим получить значение на один день вперед.

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

Спасибо

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

В 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 str = addedDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));

Если вы используете Java SE 8 или выше, вы должны использовать новый API Date / Time

 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/YYYY");

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

Apache Commons уже имеет этот DateUtils.addDays(Дата, число, int) http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/time/DateUtils.html, который вы используете или можете использовать JodaTime, чтобы сделать его более чистым.

Если вы хотите добавить одну единицу времени и ожидаете, что будут увеличены и другие поля, вы можете смело использовать метод add. Смотрите пример ниже:

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

Просто укажите дату в строке и число следующих дней

 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;

}

Использовать DateFormat API для преобразования String в объект Date, затем используйте Calendar API добавить один день. Дайте мне знать, если вы хотите конкретные примеры кода, и я могу обновить свой ответ.

Попробуйте этот метод:

      public static Date addDay(int day) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.DATE, day);
        return calendar.getTime();
}

Это на самом деле просто. Один день содержит 86400000 миллисекунд. Итак, сначала вы получите текущее время в миллисекундах из системы с помощьюSystem.currentTimeMillis() затем добавьте 84000000 миллисекунд и используйте Date Класс для генерации формата даты за миллисекунды.

пример

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

Строка Сегодня будет 2019-05-9

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

Струна завтра будет 2019-05-10

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

Строка DayAfterTommorow будет 2019-05-11

Вы можете использовать этот пакет из "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);  

Если вы используете 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); 
}

Ответ с наибольшим количеством голосов использует наследиеjava.utilAPI даты и времени, который был правильным в 2009 году, когда был задан вопрос. В марте 2014 года API заменил подверженный ошибкам устаревший API даты и времени . С тех пор настоятельно рекомендуется использовать этот современный API даты и времени.

Я работаю с датой в этом формате:yyyy-mm-dd

Вы использовали неправильную букву для месяца, независимо от того, используете ли вы устаревший API синтаксического анализа/форматирования или современный . Письмоmиспользуется для минуты часа , а правильная буква для месяца годаM.

yyyy-MM-ddформат по умолчаниюjava.time.LocalDate

API основан на стандартах ISO 8601 и поэтому не требует указанияDateTimeFormatterявно для анализа строки даты и времени, если она уже находится в формате ISO 8601. Точно так же toStringреализация типа возвращает строку в формате ISO 8601. Проверять LocalDate#parseи LocalDate#toStringЧтобы получить больше информации.

Способы увеличить локальную дату на один день

Есть три варианта:

  1. LocalDate#plusDays(long daysToAdd)
  2. LocalDate#plus(long amountToAdd, TemporalUnit unit): у него есть некоторые дополнительные возможности, например, вы можете использовать его для увеличения локальной даты по дням, неделям, месяцам, годам и т. д.
  3. LocalDate#plus(TemporalAmount amountToAdd): Вы можете указатьPeriod(или любой другой тип, реализующийTemporalAmount) добавить.

Демо :

      import java.time.Instant;
import java.time.LocalDate;
import java.time.Period;
import java.time.temporal.ChronoUnit;

public class Main {
    public static void main(String[] args) {
        // Parsing
        LocalDate ldt = LocalDate.parse("2020-10-20");
        System.out.println(ldt);

        // Incrementing by one day
        LocalDate oneDayLater = ldt.plusDays(1);
        System.out.println(oneDayLater);

        // Alternatively
        oneDayLater = ldt.plus(1, ChronoUnit.DAYS);
        System.out.println(oneDayLater);

        oneDayLater = ldt.plus(Period.ofDays(1));
        System.out.println(oneDayLater);

        String desiredString = oneDayLater.toString();
        System.out.println(desiredString);
    }
}

Выход :

      2020-10-20
2020-10-21
2020-10-21
2020-10-21
2020-10-21

Как перейти от устаревшего к современному API даты и времени?

Вы можете переключиться с устаревшего на современный API даты и времени, используя Date#toInstantна экземпляре java-util-date. Если у вас есть , вы можете легко получить другие типы даты и времени.java.timeAPI. АнInstantпредставляет момент времени и не зависит от часового пояса, т.е. представляет дату-время в формате UTC (часто отображается какZчто означает зулусское время и имеетZoneOffsetиз+00:00).

Демо :

      import java.time.Instant;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.util.Date;

public class Main {
    public static void main(String[] args) {
        Date date = new Date();
        Instant instant = date.toInstant();
        System.out.println(instant);

        ZonedDateTime zdt = instant.atZone(ZoneId.of("Asia/Kolkata"));
        System.out.println(zdt);

        OffsetDateTime odt = instant.atOffset(ZoneOffset.of("+05:30"));
        System.out.println(odt);
        // Alternatively, using time-zone
        odt = instant.atZone(ZoneId.of("Asia/Kolkata")).toOffsetDateTime();
        System.out.println(odt);

        LocalDateTime ldt = LocalDateTime.ofInstant(instant, ZoneId.of("Asia/Kolkata"));
        System.out.println(ldt);
        // Alternatively,
        ldt = instant.atZone(ZoneId.of("Asia/Kolkata")).toLocalDateTime();
        System.out.println(ldt);
    }
}

Выход :

      2022-11-12T12:52:18.016Z
2022-11-12T18:22:18.016+05:30[Asia/Kolkata]
2022-11-12T18:22:18.016+05:30
2022-11-12T18:22:18.016+05:30
2022-11-12T18:22:18.016
2022-11-12T18:22:18.016

Узнайте больше о современном API Date-Time от Trail: Date Time .

Вы можете сделать это одной строкой.

например, чтобы добавить 5 дней

      Date newDate = Date.from(Date().toInstant().plus(5, ChronoUnit.DAYS));

вычесть 5 дней

      Date newDate = Date.from(Date().toInstant().minus(5, ChronoUnit.DAYS));

Давайте проясним пример использования: вы хотите сделать арифметику календаря и начать / закончить с 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);
Другие вопросы по тегам