2010-03-24 6 views
14

Non sono del tutto sicuro di quale campo utilizzare quando si aggiungono più di 30 giorni a un oggetto di calendario Java. C'è qualche differenza tra Calendar.DAY_OF_MONTH e Calendar.DAY_OF_YEAR?aggiungere più di 30 giorni con il metodo add() di Calendar in Java

Esempio:

GregorianCalendar d = new GregorianCalendar(); 
d.add(Calendar.DAY_OF_YEAR, 90); 

vs

GregorianCalendar d = new GregorianCalendar(); 
d.add(Calendar.DAY_OF_MONTH, 90); 

Grazie.

+0

Il codice implica che tutti i mesi hanno 30 giorni. – whiskeysierra

risposta

17

Non credo che faccia la differenza quando si chiama aggiungi. La distinzione è importante quando chiami i getter.

Entrambi i metodi funzionano correttamente, giusto? Per più di 30 giorni, oltre a importi negativi.

L'(certamente complicato) fonte per GregorianCalendar # add ha questa sezione:

case DAY_OF_MONTH: // synonym of DATE 
case DAY_OF_YEAR: 
case DAY_OF_WEEK: 
    break; 
+0

Grazie per la conferma della fonte. – Haes

+2

Il comportamento di over/underflow quando si utilizza il metodo add è ben definito nella documentazione dell'API: "L'overflow si verifica quando un valore di campo supera il suo intervallo e, di conseguenza, il campo successivo più grande viene incrementato o decrementato e il valore del campo è rientrato nel suo raggio d'azione. " Quindi, traboccando il campo DAY_OF_MONTH, significa che il campo MONTH (successivo più grande) viene incrementato e il campo DAY_OF_MONTH impostato su 1 (riaggiustato nel suo intervallo valido). – jarnbjo

+0

@jarnbjo: e penso che la stessa identica cosa accade per DAY_OF_YEAR, DAY_OF_WEEK e DATE. – Thilo

0

tl; dr

LocalDate.now(ZoneId.of("America/Montreal")) 
     .plusDays(30) 

dettagli

Molto più facile ora con le moderne classi java.time che soppianta le vecchie classi Calendar & Date.

LocalDate

La classe LocalDate rappresenta un valore di data-solo senza tempo del giorno e senza fuso orario.

Un fuso orario è fondamentale per determinare una data. Per un dato momento, la data varia in tutto il mondo per zona. Ad esempio, pochi minuti dopo la mezzanotte in Paris France è un nuovo giorno mentre è ancora "ieri" in Montréal Québec.

Specificare un proper time zone name nel formato continent/region, come ad esempio America/Montreal, Africa/Casablanca o Pacific/Auckland. Non utilizzare mai l'abbreviazione di 3-4 lettere come EST o IST poiché sono non fusi orari reali, non standardizzati e nemmeno univoci (!).

ZoneId z = ZoneId.of("America/Montreal"); 
LocalDate today = LocalDate.now(z); 

È possibile aggiungere un numero di giorni a quello.

LocalDate later = today.plusDays(30); 

Period

Si può rappresentare un lasso di tempo con la classe Period.

Period thirtyDays = Period.ofDays(30); 

È possibile eseguire data la matematica chiamando plus o minus metodi.

LocalDate later = today.plus(thirtyDays); 

su Java.tempo

Il framework java.time è integrato in Java 8 e versioni successive. Queste classi soppiantare classi legacy date-time vecchi fastidiose come java.util.Date, Calendar, & SimpleDateFormat.

Il progetto Joda-Time, ora in maintenance mode, consiglia la migrazione alle classi java.time.

Per ulteriori informazioni, vedere Oracle Tutorial. E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310.

Dove ottenere le classi java.time?

  • Java SE 8 e SE 9 e successivamente
    • incorporato.
    • Parte dell'API Java standard con un'implementazione in bundle.
    • Java 9 aggiunge alcune funzionalità e correzioni minori.
  • Java SE 6 e SE 7
    • Molte delle funzionalità java.time è di back-porting per Java 6 .
  • Android

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

Problemi correlati