Come aggiungere un giorno ad una data?

Voglio aggiungere un giorno a una data particolare. Come lo posso fare?

Date dt = new Date(); 

Ora voglio aggiungere un giorno a questa data.

Data una Date dt hai diverse possibilità:

Soluzione 1: è ansible utilizzare la class Calendar per questo:

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

Soluzione 2: si dovrebbe prendere seriamente in considerazione l’utilizzo della libreria Joda-Time , a causa delle varie carenze della class Date . Con Joda-Time puoi fare quanto segue:

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

Soluzione 3: con Java 8 è anche ansible utilizzare la nuova API JSR 310 (che si ispira a Joda-Time):

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

La data ha un costruttore che utilizza i millisecondi dall’epoca UNIX. il metodo getTime () – ti dà quel valore. Quindi aggiungere i millisecondi per un giorno, fa il trucco. Se si desidera eseguire regolarmente tali manipolazioni, si consiglia di definire le costanti per i valori.

Suggerimento importante: non è corretto in tutti i casi. Leggi il commento di AVVERTENZA, di seguito.

Come menzionato nella risposta Top, poiché java 8 è ansible fare:

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

ma questo a volte può portare a un DateTimeException come questo:

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

È ansible evitare questa eccezione semplicemente passando il fuso orario:

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

tl; dr

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

java.time

Meglio evitare del tutto la class java.util.Date . Ma se si deve fare così, è ansible convertire tra le fastidiose vecchie lezioni di data legacy e le moderne classi java.time. Guarda ai nuovi metodi aggiunti alle vecchie classi.

Instant

La class Instant , è vicina ad essere equivalente a Date , essendo entrambi un momento nella timeline. Instant risolve in nanosecondi, mentre Date è millisecondi.

 Instant instant = myUtilDate.toInstant() ; 

Potresti aggiungere un giorno a questo, ma tieni presente questo in UTC. Quindi non dovrai tenere conto di anomalie come l’ora legale. Specificare l’unità di tempo con la class ChronoUnit .

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

ZonedDateTime

Se vuoi essere esperto con i fusi orari, specifica un ZoneId per ottenere un ZonedDateTime . Specificare un nome di fuso orario appropriato nel formato di continent/region , ad esempio America/Montreal , Africa/Casablanca o Pacific/Auckland . Non utilizzare mai l’abbreviazione di 3-4 lettere come EST o IST quanto non sono veri fusi orari, non standardizzati e nemmeno unici (!).

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

Puoi anche rappresentare il tuo span-of-time da aggiungere, un giorno, come Period .

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

Potresti volere il primo momento di quel giorno dopo. Non pensare che il giorno inizi alle 00:00:00. Anomalie come Daylight Saving Time (DST) indicano che il giorno potrebbe iniziare in un altro momento, ad esempio 01:00:00. Lascia che java.time determini il primo momento del giorno in quella data in quella zona.

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

A proposito di java.time

Il framework java.time è integrato in Java 8 e versioni successive. Queste classi soppiantano le fastidiose vecchie lezioni di data e ora come java.util.Date , Calendar e SimpleDateFormat .

Il progetto Joda-Time , ora in modalità di manutenzione , consiglia la migrazione alle classi java.time .

Per saperne di più, consultare l’ esercitazione Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .

È ansible scambiare oggetti java.time direttamente con il proprio database. Utilizzare un driver JDBC compatibile con JDBC 4.2 o successivo. Nessuna necessità di stringhe, nessuna necessità per le classi java.sql.* .

Dove ottenere le classi java.time?

  • Java SE 8 , Java SE 9 , Java SE 10 e versioni successive
    • Built-in.
    • Parte dell’API Java standard con un’implementazione in bundle.
    • Java 9 aggiunge alcune funzionalità e correzioni minori.
  • Java SE 6 e Java SE 7
    • Gran parte della funzionalità java.time è back-porting su Java 6 e 7 in ThreeTen-Backport .
  • android
    • Versioni successive di implementazioni di bundle Android delle classi java.time.
    • Per Android precedente (<26), il progetto ThreeTenABP adatta ThreeTen-Backport (menzionato sopra). Vedi Come usare ThreeTenABP ….

Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un terreno di prova per possibili aggiunte future a java.time. Puoi trovare alcune classi utili come Interval , YearWeek , YearQuarter e altro .


Aggiornamento: la libreria Joda-Time è ora in modalità di manutenzione. Il team consiglia la migrazione alle classi java.time. Sto lasciando intatta questa sezione per la storia.

Joda-Time

La libreria Joda-Time 2.3 rende questo tipo di lavoro data-ora molto più semplice. La class java.util.Date in bundle con Java è notoriamente problematica e dovrebbe essere evitata.

Ecco alcuni esempi di codice.

Il tuo java.util.Date viene convertito in un object DateTime Joda-Time. A differenza di un juDate, un DateTime conosce veramente il fuso orario assegnato. Il fuso orario è cruciale in quanto l’aggiunta di un giorno per ottenere lo stesso orario di domani potrebbe significare apportare modifiche, ad esempio per un giorno di 23 ore o di 25 ore nel caso di ora legale (DST) qui negli Stati Uniti. Se si specifica il fuso orario , Joda-Time può eseguire questo tipo di regolazione. Dopo aver aggiunto un giorno, convertiamo l’object DateTime in un object 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(); 

Dump to console …

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

Quando corri …

 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 

Ciò aumenterà qualsiasi data esattamente da 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); 

è ansible utilizzare questo metodo dopo importare org.apache.commons.lang.time.DateUtils :

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

Ho trovato un metodo semplice per aggiungere tempo arbitrario a un object Date

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

Dove:

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

usa l’object DateTime obj.Add per aggiungere quello che vuoi ora al giorno e così via. Spero che funzioni 🙂

Preferisco la joda per l’aritmetica data e ora perché è molto più leggibile:

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

O

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

API LocalDate di Java 8

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

Per renderlo un po ‘meno java specifico, il principio di base sarebbe quello di convertire in un formato di data lineare, giorni julian, giorni julian modificati, secondi da qualche epoca, ecc, aggiungere il giorno e riconvertire.

Il motivo per cui lo fai è che devi risolvere il problema “ottieni il giorno bisestile, il secondo salto, ecc.” A qualcuno che, con un po ‘di fortuna, non ha ingannato il problema.

Ti informsrò che ottenere queste routine di conversione può essere difficile. Ci sono un numero incredibile di modi diversi in cui le persone incasinano il tempo, l’esempio più recente di alto profilo è stato MS Zune. Non è troppo divertente per MS, è facile sbagliare. Non aiuta che ci siano più formati di tempo diversi, per esempio, TAI vs TT.

cosa migliore da usare:

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

Allo stesso modo, puoi aggiungere MESI, GIORNI, MINUTI ecc

Nel caso molto speciale Se hai chiesto di fare la tua lezione di data, possibilmente dal tuo professore di programmazione informatica; Questo metodo farebbe un ottimo lavoro.

 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 versione di Java 1.8 ha un buon aggiornamento per l’API di data time.

Ecco uno snippet di codice:

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

Produzione:

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

Per maggiori informazioni consultare la documentazione di Java in queste classi:

  • LocalDate
  • DateTimeFormatter

vuoi dopo giorni trovare la data questo codice prova ..

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

Ti mostrerò come possiamo farlo in Java 8 . Ecco qui:

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

Il risultato:

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

API Java 8 Time:

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

Puoi provare la libreria java.util.Date questo modo-

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

Cambia il valore di no_of_day_to_add come vuoi.

Ho impostato il valore di no_of_day_to_add su 1 perché volevi aggiungere solo un giorno.

Altro può essere trovato in questa documentazione .