tl; dr
LocalDate
.now(ZoneId.of("Pacific/Auckland")) // Get the date-only value for the current moment in a specified time zone.
.minusWeeks(1) // Go back in time one week.
.atStartOfDay(ZoneId.of("Pacific/Auckland")) // Determine the first moment of the day for that date in the specified time zone.
.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) // Generate a string in standard ISO 8601 format.
.replace("T" , " ") // Replace the standard "T" separating date portion from time-of-day portion with a SPACE character.
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.
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.forID("America/Montreal") ;
LocalDate now = LocalDate.now (z) ;
fare alcuni matematica utilizzando i minus…
e plus…
metodi.
LocalDate weekAgo = now.minusWeeks(1);
Lascia che java.time determini il primo momento della giornata per il fuso orario desiderato. Non pensare che la giornata inizi al 00:00:00
. Anomalie come Daylight Saving Time significa che il giorno potrebbe iniziare in un altro momento della giornata, ad esempio 01:00:00
.
ZonedDateTime weekAgoStart = weekAgo.atStartOfDay(z) ;
generare una stringa che rappresenta l'oggetto ZonedDateTime
utilizzando un oggetto DateTimeFormatter
. Cerca Stack Overflow per molte altre discussioni su questo corso.
DateTimeFormatter f = DateTimeFormatter.ISO_LOCAL_DATE_TIME ;
String output = weekAgoStart.format(f) ;
Questo formato standard è vicino a ciò che si vuole, ma ha una T
nel mezzo in cui si desidera uno spazio. Quindi sostituire lo SPAZIO per T
.
output = output.replace("T" , " ") ;
Chi java.time
Il quadro java.time è costruito in Java 8 e versioni successive. Queste classi soppiantano le fastidiose classi 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
Joda Time
Update: Il progetto Joda Time è ora in modalità di manutenzione. Il team consiglia la migrazione alle classi java.time.
L'utilizzo della libreria Joda-Time semplifica notevolmente le operazioni di data e ora.
Nota l'uso di un fuso orario. Se omesso, stai lavorando in UTC o nel fuso orario predefinito della JVM.
DateTime now = DateTime.now (DateTimeZone.forID("America/Montreal")) ;
DateTime weekAgo = now.minusWeeks(1);
DateTime weekAgoStart = weekAgo.withTimeAtStartOfDay();
Penso che dovresti usare Calendar.roll() invece di Calendar.add() se vuoi gestire il cambio mese/anno giusto. Il tuo esempio potrebbe essere sbagliato tra il 1 ° e il 6 gennaio. –
Penso che sia vero il contrario: roll() non gestisce le modifiche mese/anno quando viene chiamato alla data, mentre add() lo fa. –
Ok, mio male! ;-) –