2009-04-05 10 views
8

Il mio programma riguarda la generazione (produzione) di un Kurosawa e la produzione dei clienti.Data aritmetica in Java, aggiunta 3 mesi da oggi

Ogni volta che generiamo un Kurosawa, dobbiamo stampare il suo ID, la sua data di produzione e la data di scadenza, che è di 3 mesi dalla data di produzione.

Il mio problema è: Come posso calcolare la data dopo 3 mesi?

+0

BTW, Che cos'è un Kurosawa? –

+1

Secondo Wikipedia, è un sake prodotto a Saku, Nagano, in Giappone. –

risposta

15

Utilizzare lo Java Calendar API integrato.

Calendar c = Calendar.getInstance(); 
c.add(Calendar.MONTH, 3); 

Fare riferimento all'API per sapere esattamente come stampare la data, nel formato che si sta cercando.

9

Si potrebbe anche usare il molto più potente e più facile da usare Joda Time Library:

DateMidnight productionDate = new DateMidnight(); 
DateMidnight expirationDate = productionDate.plusMonths(3); 
System.out.println(expirationDate.toString("dd.MM.yyyy")); 

Joda Time ha molti vantaggi rispetto alla built-in Java Calendar API.

+0

Perché utilizzare Joda per qualcosa di semplice come aggiungere 3 mesi a una data? – javashlook

+1

Hai ragione ma quando aggiungi 3 mesi a un java.util.Date/Calendar puoi manipolare la stessa istanza che potrebbe essere soggetta a errori. Gli oggetti Joda-Time sono immutabili.E penso che di solito tu faccia qualcosa di più che con date piuttosto che aggiungere solo 3 mesi. Spero che Java7 includa Joda-Time (JSR310) –

0

Se avete bisogno di lavorare con la data aritmetica funziona JODA meglio, come Calendar ama i timestamp.

0

/La classe java Il calendario è astratto. Quindi è necessario utilizzare la classe GregorianCalendar./

java.util.GregorianCalendar gC = new java.util.GregorianCalendar(); 

java.util.Date yourDate = new java.util.Date(); 
gC.setTime(yourDate); 

/Aggiungere 3 mesi/

gC.add(java.util.Calendar.MONTH_OF_YEAR, 3); 

/tornare 1 settimana/

gC.add(java.util.Calendar.WEEK_OF_YEAR, -1); 
+2

The [getInstance] (http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html#getInstance%28%29) i metodi di Calendar sono statici, quindi puoi usarli. – KSev

+1

E sono preferiti, perché getInstance() è un metodo factory statico (vedi Java efficace, Joshua Bloch) che cercherà di determinare il momento migliore per le impostazioni internazionali. –

1

tl; dr

LocalDate.now()   // Determine today’s date. 
     .plusMonths(3) // Add three months. 

java.time

L'approccio moderno utilizza le classi java.time.

La classe LocalDate rappresenta un valore di sola data senza ora 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.

Se non viene specificato alcun fuso orario, la JVM applica implicitamente il suo fuso orario predefinito corrente. L'impostazione predefinita può cambiare in qualsiasi momento, quindi i risultati potrebbero variare. Meglio specificare esplicitamente il fuso orario desiderato/previsto come argomento.

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

Aggiungere tre mesi, lasciando java.time fare i conti.

LocalDate threeMonthsLater = today.plusMonths(3) ; 

Chi java.time

Il quadro java.time è costruito in Java 8 e versioni successive. Queste classi soppiantano le fastidiose classi di data legacy 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, Java SE 9, e più tardi
    • incorporato.
    • 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
    • Molte delle funzionalità java.time è di back-porting per Java 6 .
  • Android
    • versioni successive di implementazioni fascio Android delle classi java.time.
    • Per Android precedente, il progetto ThreeTenABP si adatta a ThreeTen-Backport (menzionato sopra). Vedi How to use ThreeTenABP….

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.