¿Cómo puedo incrementar una fecha en un día en Java?

562

Estoy trabajando con una fecha en este formato: yyyy-mm-dd.

¿Cómo puedo incrementar esta fecha en un día?

user48094
fuente
10
Si está utilizando Java 8 o más reciente, puede usar la nueva API de fecha / hora. Vea esta respuesta: stackoverflow.com/a/23910924/1115554
micha
44
nuevo DateTime (). plusDays (1) .toDate () ???
Pietro

Respuestas:

686

Algo como esto debería hacer el truco:

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
Dave
fuente
50
@Esko, c.roll (Calendar.DATE, verdadero) no pasará el mes el último día del mes.
Sam Hasler
18
@Ammar, es una mala idea si no
entendiste
13
Citaré algunos JavaDocs ... Calendar.DATE: "... Este es un sinónimo de DAY_OF_MONTH". Desearía que los JavaDoc aclararan que esto incrementaría los campos más grandes (como el mes y el año). Calendar.roll "Agrega o resta (arriba / abajo) una sola unidad de tiempo en el campo de tiempo dado sin cambiar los campos más grandes". De nuevo, "campos más grandes" es vago, pero eso parece coherente con el comentario de Sam. Desearía que hubiera un StackOverflow para arreglar los viejos JavaDocs.
jcalfee314
44
chicos, desafortunadamente, es bastante inútil agregar días usando DATE, DAY_OF_MONTH o incluso DAY_OF_YEAR; todos se incrementan por módulo. Entonces, considerando el Calendario del 31-12-1970, add (DAY_OF_YEAR, 1) o roll (), sin embargo roll () finalmente llama a add (), dará 01-01-1970. Supongo que la única forma correcta es establecer el tiempo con milisegundos. En cuanto a mí, nunca volveré a usar la clase Calendario.
Dmitry Gryazin
14
@Bagzerg: Estás equivocado . add()rodará la fecha. Ver en ideone .
Jean Hominal
212

Java parece estar muy por detrás de la bola ocho en comparación con C #. Este método de utilidad muestra la forma de hacerlo en Java SE 6 usando el método Calendar.add (presumiblemente la única forma fácil).

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

Para agregar un día, según la pregunta formulada, llámelo de la siguiente manera:

String sourceDate = "2012-02-29";
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date myDate = format.parse(sourceDate);
myDate = DateUtil.addDays(myDate, 1);
Lisa
fuente
44
Para su información, las antiguas clases de fecha y hora terriblemente problemáticas como java.util.Date, java.util.Calendary java.text.SimpleDateFormatahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y posteriores. Ver Tutorial de Oracle .
Basil Bourque
80

java.time

En Java 8 y posterior, el paquete java.time lo hace más o menos automático. ( Tutorial )

Asumiendo Stringentrada y salida:

import java.time.LocalDate;

public class DateIncrementer {
  static public String addOneDay(String date) {
    return LocalDate.parse(date).plusDays(1).toString();
  }
}
Daniel C. Sobral
fuente
3
Para su información, ambos ZonedDateDateTimey OffsetDateTimetambién tienen plusDaysy minusDaysmétodos, así comoLocalDate
Basil Bourque
@BasilBourque Claro, pero la información disponible en la pregunta es la de a LocalDate.
Daniel C. Sobral
2
@DanielCSobral Sí. Simplemente agregue enlaces para la edificación de sus lectores. No es una critica.
Basil Bourque
65

Prefiero usar DateUtils de Apache. Compruebe esto http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/time/DateUtils.html . Es útil especialmente cuando tiene que usarlo en múltiples lugares en su proyecto y no desea escribir su método de línea única para esto.

La API dice:

addDays (fecha fecha, cantidad int): agrega una cantidad de días a una fecha que devuelve un nuevo objeto.

Tenga en cuenta que devuelve un nuevo objeto Date y no realiza cambios en el anterior.

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

Construya un objeto Calendario y use el método add (Calendar.DATE, 1);

krosenvold
fuente
43

Echa un vistazo a Joda-Time ( https://www.joda.org/joda-time/ ).

DateTimeFormatter parser = ISODateTimeFormat.date();

DateTime date = parser.parseDateTime(dateString);

String nextDay = parser.print(date.plusDays(1));
Willi aus Rohr
fuente
3
Puede eliminar las llamadas del analizador para construir el DateTime. Use DateTime date = new DateTime (dateString); Entonces, nextDay es ISODateTimeFormat.date (). Print (date.plusDays (1)); Ver joda-time.sourceforge.net/api-release/org/joda/time/… para más información.
MetroidFan2002
Para obtener un código de ejemplo más detallado con Joda-Time, consulte mi respuesta a una pregunta similar, ¿Cómo agregar un día a una fecha? .
Basil Bourque
2
FYI ... El proyecto Joda-Time ahora está en modo de mantenimiento y aconseja la migración a las clases java.time . Ambos esfuerzos fueron dirigidos por el mismo hombre, Stephen Colebourne. Entonces comparten conceptos similares, y la migración no es difícil.
Basil Bourque
40

Tenga en cuenta que esta línea agrega 24 horas:

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

pero esta línea agrega un día

cal.add( Calendar.DATE, 1 );

¡En los días con un cambio de horario de verano (25 o 23 horas) obtendrá resultados diferentes!

Florian R.
fuente
40

Java 8 agregó una nueva API para trabajar con fechas y horas.

Con Java 8 puede usar las siguientes líneas de código:

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

// add one day
LocalDate januarySecond = januaryFirst.plusDays(1);
micha
fuente
1
Supongo que quisiste decir que januaryFirst.plusDays(1)no date.plusDays(1).
TeWu
Esto solo es compatible con Android O developer.android.com/reference/java/time/package-summary.html
Subho
1
@Subho Para Android antes del 26, vea el proyecto ThreeTenABP que adapta el proyecto ThreeTen-Backport , un puerto de respaldo si la mayor parte de la funcionalidad java-time es para Java 6 y Java 7.
Basil Bourque
29

puedes usar Simple java.util lib

Calendar cal = Calendar.getInstance(); 
cal.setTime(yourDate); 
cal.add(Calendar.DATE, 1);
yourDate = cal.getTime();
Pawan Pareek
fuente
1
Esta respuesta duplica el contenido de múltiples respuestas, incluida la respuesta aceptada de hace tres años. Elimine su Respuesta o edite para agregar valor.
Basil Bourque
3
esta respuesta es más limpia, no analiza la fecha en el medio. la "respuesta aceptada" es demasiado complicada. es bueno que hayas añadido el tuyo, ignora el comentario automatizado de basil
Mickey Perlstein
Para su información, las antiguas clases de fecha y hora terriblemente problemáticas como java.util.Date, java.util.Calendary java.text.SimpleDateFormatahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y posteriores. Ver Tutorial de Oracle .
Basil Bourque
La mejor respuesta, directo al grano. Estoy de acuerdo con Mickey, solo
ignoro
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);

Esto dará la fecha de mañana. c.add(...)los parámetros podrían cambiarse de 1 a otro número para un incremento apropiado.

Akhilesh T.
fuente
1
puede hacer algo como c.setTime (objeto Date) para establecer una Fecha específica antes de agregar.
Linh Lino
Desearía que los paquetes java predeterminados hicieran que las fechas de manejo fueran menos complicadas ... Quiero decir, es un dolor cada vez que quieres lidiar con las fechas ... solo una queja ...
Shn_Android_Dev
1
@Shn_Android_Dev Las clases java.time integradas en Java 8 y posteriores suplantan a las antiguas clases terribles de fecha y hora y responden a su deseo. También se transfirió a Java 6/7 y Android anterior en los proyectos ThreeTen-Backport y ThreeTenABP . No es necesario utilizar alguna Dateo Calendarnuevo.
Basil Bourque
19

Si está utilizando Java 8 , hágalo así.

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

Si desea usar SimpleDateFormat , hágalo así.

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
Avijit Karmakar
fuente
No, la Pregunta solicitó un valor de solo fecha, no una fecha y hora. Así que usa la LocalDateclase no LocalDateTime.
Basil Bourque
1
Su respuesta repite el contenido de al menos otras cuatro respuestas. Explique cómo el suyo agrega valor más allá de esos, o elimínelo antes de recolectar votos negativos.
Basil Bourque
16
long timeadj = 24*60*60*1000;
Date newDate = new Date (oldDate.getTime ()+timeadj);

Esto toma el número de milisegundos desde la época de oldDate y agrega 1 día de milisegundos y luego usa el constructor público Date () para crear una fecha usando el nuevo valor. Este método le permite agregar 1 día, o cualquier cantidad de horas / minutos, no solo días completos.

dvaey
fuente
Probablemente esto no sea lo que OP quería; no tiene en cuenta los ajustes de tipo horario de verano, los segundos intermedios, etc.
mrec
1
El horario de verano debe ser manejado por zona horaria / localidad. Mi ejemplo mostraba cómo incrementar en pequeñas duraciones. Cuando se incrementan en días, los segundos de salto pueden ser un problema, pero al agregar horas, es menos probable, aunque aún es posible.
dvaey
15

Desde Java 1.5 TimeUnit.DAYS.toMillis (1) me parece más limpio.

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));
Jens
fuente
Esto crea un valor de fecha y hora en el que la Pregunta solicita una fecha solamente. Sugiero que un enfoque mucho más sabio es la LocalDateclase en las clases java.time para Java 8 y posteriores, y el puerto posterior a Java 6 y Java 7 que se encuentra en el proyecto ThreeTen-Backport .
Basil Bourque
14

En Java 8, la forma más sencilla de hacerlo es:

Date.from(Instant.now().plusSeconds(SECONDS_PER_DAY))
dpk
fuente
14
Parece un poco exagerado. ¿Por qué no simplemente ir con Instant.now().plus( 1 , ChronoUnit.DAYS )?
Basil Bourque
Gracias @BasilBourque
dpk
11

En java 8 puedes usar 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

Puede convertir en java.util.Dateobjeto de la siguiente manera.

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

Puede formatear LocalDateen una cadena de la siguiente manera.

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

Es muy simple, tratar de explicar en una palabra simple. obtener la fecha de hoy de la siguiente manera

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

Ahora establezca un día antes con esta fecha por el método calendar.add que toma (constante, valor). Aquí constante podría ser FECHA, horas, minutos, segundos, etc. y el valor es el valor de la constante. Al igual que para un día, la constante por delante es Calendar.DATE y su valor es 1 porque queremos un valor por delante de un día.

System.out.println(calendar.getTime());// print modified date which is la fecha de mañana

Gracias

Kushwaha
fuente
7

Simplemente pase la fecha en Cadena y el número de días siguientes

 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;

}
LMK
fuente
7

Si desea agregar una sola unidad de tiempo y espera que también se incrementen otros campos, puede usar el método de agregar de manera segura. Ver ejemplo a continuación:

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

Imprimirá:

1970-12-31
1971-01-01
1970-12-31
terrmith
fuente
No hay una respuesta aceptada y sentí que había una confusión general si otros campos también se actualizan.
terrmith
7
startCalendar.add(Calendar.DATE, 1); //Add 1 Day to the current Calender
Abdurahman Popal
fuente
44
Gracias por querer contribuir. Sin embargo, esto ya está en varias de las otras respuestas, así que realmente no veo ningún punto ... Aparte de eso, en mi humilde opinión, nadie debería usar la Calendarclase mal diseñada y anticuada en 2019.
Ole VV
6

Si usa Java SE 8 o superior, debe usar la nueva API de fecha / hora

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

Si debe convertir de java.util.Datea java.time.LocalDate, puede usar este método.

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

Si está utilizando una versión anterior a Java SE 8, le aconsejo que use Joda-Time

Joda-Time proporciona un reemplazo de calidad para las clases de fecha y hora de Java y es la biblioteca de fecha y hora estándar de facto para Java anterior a 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);
Eduardo Eljaiek
fuente
1
Su patrón para la java.timepieza es incorrecto. Debería ser dd/MM/uuuuequivalente al JodaTime one.
TiiJ7
5

Use la DateFormatAPI para convertir la Cadena en un objeto Fecha, luego use la CalendarAPI para agregar un día. Avíseme si desea ejemplos de código específicos y puedo actualizar mi respuesta.

Ross
fuente
3

Si está utilizando Java 8, java.time.LocalDatey java.time.format.DateTimeFormatterpuede hacer que esto funcione bastante simple.

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); 
}
Evan Hu
fuente
Aún más simple: suelte el formateador y simplemente utilícelo toString()para producir el formato de cadena i aaaa-MM-dd (y si insiste, recuerde que mmson minutos mientras MMes el mes).
Ole VV
3

Puede usar este paquete desde "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);  
Shaheed
fuente
55
Sugerir Dateclases en 2018 es un mal consejo. Las antiguas clases problemáticas de fecha y hora, como java.util.Date, java.util.Calendary java.text.SimpleDateFormatahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y Java 9. Consulte el Tutorial de Oracle . Ver otras respuestas usando la LocalDateclase.
Basil Bourque
Sí lo es, LocalDate es la mejor manera de hacer eso,
Shaheed
sin embargo, algunos marcos como jsf tienen algunos pequeños problemas de integración con la API de tiempo, por lo que a veces debería usar Fecha; plus environment java <8
Lucke
1
@Lucke La mayor parte de la funcionalidad java.time se transfirió a Java 6 y 7 en el proyecto ThreeTen-Backport . Más adaptado a Android anterior en el proyecto ThreeTenABP . Entonces, realmente no hay necesidad de tocar esas malditas y horribles clases de fecha y hora. Muchos marcos han sido actualizados. Pero no todos. Entonces, si debe interoperar con el código antiguo que aún no se ha actualizado a java.time , escriba su nuevo código en java.time y convierta a / desde los tipos antiguos llamando a los nuevos métodos de conversión agregados a las clases antiguas.
Basil Bourque
1
Este código ignora la cuestión crucial de la zona horaria . Para cualquier momento dado, la fecha varía alrededor del globo por zona. La SimpleDateFormatclase desafortunadamente inyecta una zona horaria, aplicando implícitamente la zona predeterminada actual de la JVM. Por lo tanto, los resultados de este código variarán según el valor predeterminado actual, y ese valor predeterminado puede cambiar en cualquier momento durante el tiempo de ejecución.
Basil Bourque
3

Es simple en realidad. Un día contiene 86400000 milisegundos. Entonces, primero obtiene la hora actual en milis del Sistema usando System.currentTimeMillis()luego agregue 84000000 milisegundos y use elDate Clase para generar un formato de fecha A para los milisegundos.

Ejemplo

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

String Today será 2019-05-9

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

String Tommorow será 2019-05-10

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

String Day AfterTommorow será 2019-05-11

Mike T
fuente
Este código usa la Dateclase terrible que fue reemplazada hace años por las clases modernas java.time . Tanto es más fácil de usar, simplemente:LocalDate.parse( "2019-01-23" ).plusDays( 1 )
Albahaca Bourque
2

Aclaremos el caso de uso: desea hacer aritmética de calendario y comenzar / finalizar con java.util.Date .

Algunos enfoques:

  1. Convierta a cadena y viceversa con SimpleDateFormat : esta es una solución ineficiente.
  2. Convertir a LocalDate : Perdería cualquier información de la hora del día.
  3. Convertir a LocalDateTime : esto implica más pasos y debe preocuparse por la zona horaria.
  4. Convierta a época con Date.getTime () : Esto es eficiente pero está calculando con milisegundos.

Considere usar java.time.Instant :

Date _now = new Date();
Instant _instant = _now.toInstant().minus(5, ChronoUnit.DAYS);
Date _newDate = Date.from(_instant);
Chad Juliano
fuente
1
Nunca mezcle las terribles clases heredadas como Datecon las clases modernas de java.time como Instant. Las clases java.time suplantan completamente las clases heredadas. Específicamente, Instantreemplaza java.util.Date.
Basil Bourque
1
No aborda la pregunta. Está utilizando clases que representan un momento (una fecha con la hora del día en el contexto de un desplazamiento o zona). Pero la pregunta se refiere a la fecha solo sin hora del día y sin zona horaria. Ver la respuesta correcta de Sobral y la respuesta correcta de micha.
Basil Bourque
0
Date newDate = new Date();
newDate.setDate(newDate.getDate()+1);
System.out.println(newDate);
Filip Trajcevski
fuente
14
digo, Date.setDate () está en desuso
Kelly S. French
En mi computadora parece funcionar al otro lado de un mes. Después Sun Apr 30 16:25:33 CEST 2017viene Mon May 01 16:25:33 CEST 2017. Sin embargo, sigue siendo una solución desanimada. No solo el método está en desuso por una buena razón, también en 2017 tenemos muy buenas alternativas a la Dateclase.
Ole VV