Si stanno utilizzando fastidiose classi data/ora ora soppiantate dalle classi java.time.
dati di input errati
tua prima corda ad esempio non è corretto, in quanto il 21 è un non Lunedi di Martedì. La seconda stringa di esempio con 22nd è corretta e utilizzata nel mio codice di esempio qui sotto.
Utilizzando java.time Evitare
utilizzando questo tipo di formato per le rappresentazioni testuali di valori di data e ora. In particolare, non utilizzare mai l'abbreviazione di 3-4 lettere come EST
o IST
visto in questo tipo di formato, in quanto non sono veri fusi orari, non standardizzati e nemmeno univoci (!). Specificare uno proper time zone name. In questo caso particolare, java.time è in grado di tradurre questo come GMT
come UTC, ma altri valori potrebbero non riuscire.
String input = "Tue May 22 14:52:00 GMT 2012";
DateTimeFormatter f = DateTimeFormatter.ofPattern ("EEE MMM dd HH:mm:ss z uuuu").withLocale (Locale.US);
ZonedDateTime zdt = ZonedDateTime.parse (input , f);
System.out.println ("zdt: " + zdt);
Discarica per consolle. Il metodo toString
genera una stringa nel formato standard ISO 8601, estesa aggiungendo il nome della zona tra parentesi. Questi formati standard sono una scelta molto migliore quando è necessario serializzare i valori di data e ora in testo.
System.out.println ("zdt: " + zdt);
zdt: 2012-05-22T14: 52Z [GMT]
Generare String
È possibile generare una stringa per rappresentare questo valore in qualsiasi formato che desiderate. Generalmente è meglio lasciare che java.time si localizzi automaticamente usando uno Locale
e DateTimeFormatter
.
Il formato desiderato utilizza uno stile di media lunghezza per la parte di data ma uno stile di breve durata per la porzione di ora del giorno. Fortunatamente il DateTimeFormatter
consente di localizzare ciascuna porzione separatamente, come si vede qui dove passiamo una coppia di oggetti FormatStyle
.
Locale l = Locale.US; // Or Locale.CANADA_FRENCH, or Locale.ITALY, etc.
DateTimeFormatter fOutput = DateTimeFormatter.ofLocalizedDateTime (FormatStyle.MEDIUM , FormatStyle.SHORT).withLocale (l);
String output = zdt.format (fOutput);
Discarica per consolle.
System.out.println ("zdt: " + zdt + " | output: " + output);
zdt: 2012-05-22T14: 52Z [GMT] | uscita: 22 maggio 2012 14:52
Chi java.time
Il quadro java.time è integrato in Java 8 e versioni successive. Queste classi sostituiscono le vecchie e fastidiose lezioni di data-ora come java.util.Date
, .Calendar
, & java.text.SimpleDateFormat
.
Il progetto Joda-Time, ora in maintenance mode, consiglia la migrazione a java.time.
Per ulteriori informazioni, vedere Oracle Tutorial. E cerca Stack Overflow per molti esempi e spiegazioni.
Molte delle funzionalità java.time è back-porting di Java 6 & 7 in ThreeTen-Backport e in seguito atto a Android in ThreeTenABP (vedi How to use…).
Il progetto ThreeTen-Extra estende java.time 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 altro.
Qual è l'eccezione? –
qual è stata l'eccezione? – Jeshurun
Il testo di esempio in alto è il 21, che è un lunedì e non un martedì. Diverso dal codice di esempio. –