¿Cómo agregar un día a una cita?

Quiero agregar un día a una fecha en particular. ¿Cómo puedo hacer eso?

Date dt = new Date(); 

Ahora quiero agregar un día a esta fecha.

Dada una Date dt tienes varias posibilidades:

Solución 1: puede usar la clase Calendar para eso:

 Date dt = new Date(); Calendar c = Calendar.getInstance(); c.setTime(dt); c.add(Calendar.DATE, 1); dt = c.getTime(); 

Solución 2: debe considerar seriamente utilizar la biblioteca Joda-Time , debido a las diversas deficiencias de la clase Date . Con Joda-Time puedes hacer lo siguiente:

 Date dt = new Date(); DateTime dtOrg = new DateTime(dt); DateTime dtPlusOne = dtOrg.plusDays(1); 

Solución 3: con Java 8 también puede usar la nueva API JSR 310 (que está inspirada en Joda-Time):

 LocalDateTime.from(dt.toInstant()).plusDays(1); 
 Date today = new Date(); Date tomorrow = new Date(today.getTime() + (1000 * 60 * 60 * 24)); 

Date tiene un constructor que usa los milisegundos desde UNIX-epoch. el método getTime () te da ese valor. Así que agregar los milisegundos por un día, funciona. Si quiere hacer tales manipulaciones regularmente, le recomiendo que defina constantes para los valores.

Pista importante: eso no es correcto en todos los casos. Lea el comentario ADVERTENCIA, a continuación.

Como se menciona en la respuesta superior, desde java 8 es posible hacer:

 Date dt = new Date(); LocalDateTime.from(dt.toInstant()).plusDays(1); 

pero esto a veces puede llevar a una DateTimeException como esta:

 java.time.DateTimeException: Unable to obtain LocalDateTime from TemporalAccessor: 2014-11-29T03:20:10.800Z of type java.time.Instant 

Es posible evitar esta excepción simplemente pasando el huso horario:

 LocalDateTime.from(dt.toInstant().atZone(ZoneId.of("UTC"))).plusDays(1); 

tl; dr

 LocalDate.of( 2017 , Month.JANUARY , 23 ) .plusDays( 1 ) 

java.time

Es mejor evitar la clase java.util.Date completo. Pero si debe hacerlo, puede realizar conversiones entre las problemáticas clases heredadas antiguas de fecha y hora y las modernas clases java.time. Mire los nuevos métodos agregados a las clases antiguas.

Instant

La clase Instant , está cerca de ser equivalente a Date , ambos son un momento en la línea de tiempo. Instant resuelve en nanosegundos, mientras que Date es milisegundos.

 Instant instant = myUtilDate.toInstant() ; 

Puede agregar un día a esto, pero tenga esto en cuenta en UTC. Por lo tanto, no tendrá en cuenta anomalías como el horario de verano. Especifique la unidad de tiempo con la clase ChronoUnit .

 Instant nextDay = instant.plus( 1 , ChronoUnit.DAYS ) ; 

ZonedDateTime

Si desea conocer las zonas horarias, especifique un ZoneId para obtener un tiempo de ZonedDateTime . Especifique un nombre de zona horaria adecuada en el formato continent/region , como America/Montreal , Africa/Casablanca o Pacific/Auckland . Nunca utilice la abreviatura de 3-4 letras, como EST o IST ya que no son zonas horarias verdaderas, no están estandarizadas y ni siquiera son únicas (!).

 ZoneId z = ZoneId.of( "America/Montreal" ) ; ZonedDateTime zdt = instant.atZone( z ) ; ZonedDateTime zdtNextDay = zdt.plusDays( 1 ) ; 

También puede representar su lapso de tiempo para agregarse, un día, como un Period .

 Period p = Period.ofDays( 1 ) ; ZonedDateTime zdt = ZonedDateTime.now( z ).plus( p ) ; 

Es posible que desee el primer momento de ese día siguiente. No suponga que el día comienza a las 00:00:00. Las anomalías como el horario de verano (DST) significan que el día puede comenzar en otro momento, como 01:00:00. Deje java.time determinar el primer momento del día en esa fecha en esa zona.

 LocalDate today = LocalDate.now( z ) ; LocalDate tomorrow = today.plus( p ) ; ZonedDateTime zdt = tomorrow.atStartOfDay( z ) ; 

Acerca de java.time

El marco java.time está integrado en Java 8 y posterior. Estas clases suplantan a las problemáticas antiguas clases heredadas de fecha y hora como java.util.Date , Calendar y SimpleDateFormat .

El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .

Para obtener más información, consulte el Tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .

Puede intercambiar objetos java.time directamente con su base de datos. Use un controlador JDBC que cumpla con JDBC 4.2 o posterior. Sin necesidad de cadenas, sin necesidad de clases java.sql.* .

¿Dónde obtener las clases de java.time?

  • Java SE 8 , Java SE 9 , Java SE 10 y posterior
    • Incorporado.
    • Parte de la API Java estándar con una implementación integrada.
    • Java 9 agrega algunas características y correcciones menores.
  • Java SE 6 y Java SE 7
    • Gran parte de la funcionalidad de java.time se transfiere a Java 6 y 7 en ThreeTen-Backport .
  • Androide
    • Versiones posteriores de las implementaciones del paquete de Android de las clases java.time.
    • Para Android anterior (<26), el proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente). Consulte Cómo utilizar ThreeTenABP ….

El proyecto ThreeTen-Extra amplía java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval , YearWeek , YearQuarter y más .


Actualización: la biblioteca Joda-Time ahora está en modo de mantenimiento. El equipo aconseja la migración a las clases java.time. Dejo esta sección intacta para la historia.

Joda-Time

La biblioteca Joda-Time 2.3 hace que este tipo de trabajo de fecha y hora sea mucho más fácil. La clase java.util.Date incluida con Java es notoriamente problemática y debe evitarse.

Aquí hay un código de ejemplo.

Su java.util.Date se convierte en un objeto Joda-Time DateTime . A diferencia de un JuDate, un DateTime realmente conoce su zona horaria asignada. La zona horaria es crucial, ya que agregar un día para obtener la misma hora del reloj de pared mañana podría significar realizar ajustes tales como un día de 23 o 25 horas en el caso del horario de verano (DST) aquí en los Estados Unidos. Si especifica la zona horaria , Joda-Time puede hacer ese tipo de ajuste. Después de agregar un día, convertimos el objeto DateTime nuevamente en un objeto java.util.Date.

 java.util.Date yourDate = new java.util.Date(); // Generally better to specify your time zone rather than rely on default. org.joda.time.DateTimeZone timeZone = org.joda.time.DateTimeZone.forID( "America/Los_Angeles" ); DateTime now = new DateTime( yourDate, timeZone ); DateTime tomorrow = now.plusDays( 1 ); java.util.Date tomorrowAsJUDate = tomorrow.toDate(); 

Volcado a la consola …

 System.out.println( "yourDate: " + yourDate ); System.out.println( "now: " + now ); System.out.println( "tomorrow: " + tomorrow ); System.out.println( "tomorrowAsJUDate: " + tomorrowAsJUDate ); 

Cuando se ejecuta …

 yourDate: Thu Apr 10 22:57:21 PDT 2014 now: 2014-04-10T22:57:21.535-07:00 tomorrow: 2014-04-11T22:57:21.535-07:00 tomorrowAsJUDate: Fri Apr 11 22:57:21 PDT 2014 

Esto boostá cualquier fecha por exactamente uno

 String untildate="2011-10-08";//can take any date in current format SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd" ); Calendar cal = Calendar.getInstance(); cal.setTime( dateFormat.parse(untildate)); cal.add( Calendar.DATE, 1 ); String convertedDate=dateFormat.format(cal.getTime()); System.out.println("Date increase by one.."+convertedDate); 

puede usar este método después de importar org.apache.commons.lang.time.DateUtils :

 DateUtils.addDays(new Date(), 1)); 

Encontré un método simple para agregar tiempo arbitrario a un objeto Date

 Date d = new Date(new Date().getTime() + 86400000) 

Dónde:

 86 400 000ms = 1 Day : 24*60*60*1000 3 600 000ms = 1 Hour : 60*60*1000 

use el objeto DateTime obj.Add para agregar lo que quiera la hora del día y etc. Espero que esto funcione 🙂

Prefiero joda para aritmética de fecha y hora porque es mucho mejor legible:

 Date tomorrow = now().plusDays(1).toDate(); 

O

 endOfDay(now().plus(days(1))).toDate() startOfDay(now().plus(days(1))).toDate() 

API LocalDate de Java 8

LocalDate.now().plusDays(1L);

Para que sea un toque menos específico para Java, el principio básico sería convertir a formato de fecha lineal, días julianos, días julianos modificados, segundos desde algún momento, etc., agregar su día y convertir de nuevo.

La razón para hacer esto es que sacrifiques el problema de “obtener el día bisiesto, el segundo salto, etc. correcto” a alguien que, con un poco de suerte, no haya arruinado este problema.

Le advierto que obtener estas rutinas de conversión correctas puede ser difícil. Hay un sorprendente número de formas diferentes en que las personas pierden el tiempo, el ejemplo más reciente de alto perfil fue el Zune de MS. Sin embargo, no te burles demasiado de MS, es fácil equivocarte. No ayuda que haya múltiples formatos de tiempo diferentes, por ejemplo, TAI vs TT.

Lo mejor para usar:

  long currenTime = System.currentTimeMillis(); long oneHourLater = currentTime + TimeUnit.HOURS.toMillis(1l); 

Del mismo modo, puede agregar MESES, DÍAS, MINUTOS, etc.

En caso muy especial, si solicitó hacer su propia clase de fecha, posiblemente de su Profesor de Progtwigción de Computadoras; Este método haría un trabajo excelente.

 public void addOneDay(){ int [] months = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; day++; if (day> months[month-1]){ month++; day = 1; if (month > 12){ year++; month = 1; } } } 

La versión Java 1.8 tiene una buena actualización para la API de tiempo de datos.

Aquí hay un fragmento de código:

  LocalDate lastAprilDay = LocalDate.of(2014, Month.APRIL, 30); System.out.println("last april day: " + lastAprilDay); LocalDate firstMay = lastAprilDay.plusDays(1); System.out.println("should be first may day: " + firstMay); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd"); String formatDate = formatter.format(firstMay); System.out.println("formatted date: " + formatDate); 

Salida:

 last april day: 2014-04-30 should be first may day: 2014-05-01 formatted date: 01 

Para más información, ver documentación de Java para estas clases:

  • LocalDate
  • DateTimeFormatter

quieres después de días encontrar la fecha en que este código intenta …

 public Date getToDateAfterDays(Integer day) { Date nowdate = new Date(); Calendar cal = Calendar.getInstance(); cal.setTime(nowdate); cal.add(Calendar.DATE, day); return cal.getTime(); } 

Te mostraré cómo podemos hacerlo en Java 8 . Aqui tienes:

 public class DemoDate { public static void main(String[] args) { LocalDate today = LocalDate.now(); System.out.println("Current date: " + today); //add 1 day to the current date LocalDate date1Day = today.plus(1, ChronoUnit.DAYS); System.out.println("Date After 1 day : " + date1Day); } } 

La salida:

 Current date: 2016-08-15 Date After 1 day : 2016-08-16 

Java 8 Time API:

 Instant now = Instant.now(); //current date Instant after= now.plus(Duration.ofDays(300)); Date dateAfter = Date.from(after); 

U puede probar la biblioteca java.util.Date esta manera-

 int no_of_day_to_add = 1; Date today = new Date(); Date tomorrow = new Date( today.getYear(), today.getMonth(), today.getDate() + no_of_day_to_add ); 

Cambie el valor de no_of_day_to_add como desee.

Establecí el valor de no_of_day_to_add en 1 porque solo quería agregar un día.

Se puede encontrar más en esta documentación .