String dt ="2008-01-01";// Start dateSimpleDateFormat sdf =newSimpleDateFormat("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
@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).
publicclassDateUtil{publicstaticDate addDays(Date date,int days){Calendar cal =Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DATE, days);//minus number would decrement the daysreturn 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 =newSimpleDateFormat("yyyy-MM-dd");Date myDate = format.parse(sourceDate);
myDate =DateUtil.addDays(myDate,1);
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.
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!
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 patternLocalDate januaryFirst =LocalDate.parse("2014-01-01");// add one dayLocalDate januarySecond = januaryFirst.plusDays(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();
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
La mejor respuesta, directo al grano. Estoy de acuerdo con Mickey, solo
ignoro
23
Date today =newDate();SimpleDateFormat formattedDate =newSimpleDateFormat("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.
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 DateLocalDate destDate = sourceDate.plusDays(1);// Adding a day to source date.DateTimeFormatter formatter =DateTimeFormatter.ofPattern("yyyy-MM-dd");// Setting date formatString destDate = destDate.format(formatter));// End date
Si desea usar SimpleDateFormat , hágalo así.
String sourceDate ="2017-05-27";// Start dateSimpleDateFormat sdf =newSimpleDateFormat("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 addString destDate = sdf.format(calendar.getTime());// End date
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 =newDate(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.
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.
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 .
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
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 =newSimpleDateFormat("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()));
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.
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.
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);
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.
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":
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();
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:
Convierta a cadena y viceversa con SimpleDateFormat : esta es una solución ineficiente.
Convertir a LocalDate : Perdería cualquier información de la hora del día.
Convertir a LocalDateTime : esto implica más pasos y debe preocuparse por la zona horaria.
Convierta a época con Date.getTime () : Esto es eficiente pero está calculando con milisegundos.
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 =newDate();
newDate.setDate(newDate.getDate()+1);System.out.println(newDate);
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.
Respuestas:
Algo como esto debería hacer el truco:
fuente
add()
rodará la fecha. Ver en ideone .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).
Para agregar un día, según la pregunta formulada, llámelo de la siguiente manera:
fuente
java.util.Date
,java.util.Calendar
yjava.text.SimpleDateFormat
ahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y posteriores. Ver Tutorial de Oracle .java.time
En Java 8 y posterior, el paquete java.time lo hace más o menos automático. ( Tutorial )
Asumiendo
String
entrada y salida:fuente
ZonedDateDateTime
yOffsetDateTime
también tienenplusDays
yminusDays
métodos, así comoLocalDate
LocalDate
.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:
Tenga en cuenta que devuelve un nuevo objeto Date y no realiza cambios en el anterior.
fuente
fuente
Construya un objeto Calendario y use el método add (Calendar.DATE, 1);
fuente
Echa un vistazo a Joda-Time ( https://www.joda.org/joda-time/ ).
fuente
Tenga en cuenta que esta línea agrega 24 horas:
pero esta línea agrega un día
¡En los días con un cambio de horario de verano (25 o 23 horas) obtendrá resultados diferentes!
fuente
Java 8 agregó una nueva API para trabajar con fechas y horas.
Con Java 8 puede usar las siguientes líneas de código:
fuente
januaryFirst.plusDays(1)
nodate.plusDays(1)
.puedes usar Simple java.util lib
fuente
java.util.Date
,java.util.Calendar
yjava.text.SimpleDateFormat
ahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y posteriores. Ver Tutorial de Oracle .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.fuente
Date
oCalendar
nuevo.Si está utilizando Java 8 , hágalo así.
Si desea usar SimpleDateFormat , hágalo así.
fuente
LocalDate
clase noLocalDateTime
.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.
fuente
Desde Java 1.5 TimeUnit.DAYS.toMillis (1) me parece más limpio.
fuente
LocalDate
clase 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 .En Java 8, la forma más sencilla de hacerlo es:
fuente
Instant.now().plus( 1 , ChronoUnit.DAYS )
?En java 8 puedes usar
java.time.LocalDate
Puede convertir en
java.util.Date
objeto de la siguiente manera.Puede formatear
LocalDate
en una cadena de la siguiente manera.fuente
Es muy simple, tratar de explicar en una palabra simple. obtener la fecha de hoy de la siguiente manera
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ñanaGracias
fuente
Apache Commons ya tiene este DateUtils.addDays (Fecha fecha, cantidad int) http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/time/DateUtils.html#addDays%28java .util.Date,% 20int% 29 que utilizas o puedes utilizar JodaTime para hacerlo más limpio.
fuente
Simplemente pase la fecha en Cadena y el número de días siguientes
fuente
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:
Imprimirá:
fuente
fuente
Calendar
clase mal diseñada y anticuada en 2019.Si usa Java SE 8 o superior, debe usar la nueva API de fecha / hora
Si debe convertir de
java.util.Date
ajava.time.LocalDate
, puede usar este método.Si está utilizando una versión anterior a Java SE 8, le aconsejo que use Joda-Time
fuente
java.time
pieza es incorrecto. Debería serdd/MM/uuuu
equivalente al JodaTime one.Use la
DateFormat
API para convertir la Cadena en un objeto Fecha, luego use laCalendar
API para agregar un día. Avíseme si desea ejemplos de código específicos y puedo actualizar mi respuesta.fuente
Si está utilizando Java 8,
java.time.LocalDate
yjava.time.format.DateTimeFormatter
puede hacer que esto funcione bastante simple.fuente
toString()
para producir el formato de cadena i aaaa-MM-dd (y si insiste, recuerde quemm
son minutos mientrasMM
es el mes).Puede usar este paquete desde "org.apache.commons.lang3.time":
fuente
Date
clases en 2018 es un mal consejo. Las antiguas clases problemáticas de fecha y hora, comojava.util.Date
,java.util.Calendar
yjava.text.SimpleDateFormat
ahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y Java 9. Consulte el Tutorial de Oracle . Ver otras respuestas usando laLocalDate
clase.SimpleDateFormat
clase 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.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
fuente
Date
clase 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 )
Aclaremos el caso de uso: desea hacer aritmética de calendario y comenzar / finalizar con java.util.Date .
Algunos enfoques:
Considere usar java.time.Instant :
fuente
Date
con las clases modernas de java.time comoInstant
. Las clases java.time suplantan completamente las clases heredadas. Específicamente,Instant
reemplazajava.util.Date
.fuente
Sun Apr 30 16:25:33 CEST 2017
vieneMon 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 laDate
clase.