Come faccio a convertire 2010-12-15T16: 26: 49,841-08: 00 ad un GregorianCalendar in Java? [duplicare]
-
10-10-2019 - |
Domanda
Questa domanda ha già una risposta qui:
ho un appuntamento stringa "2010-12-15T16: 26: 49,841-08: 00" e ho bisogno di convertirlo in un GregorianCalendar in Java. Come si fa a fare questo?
Soluzione dalla risposta di Jesper
Codice per la soluzione usando il tempo Joda:
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ").withOffsetParsed();
DateTime date = formatter.parseDateTime("2010-12-15T16:26:49.841-08:00");
Soluzione
Purtroppo, la classe SimpleDateFormat
standard non può gestire formato ISO 8601 molto bene. Specificamente, non è in grado di gestire la :
che è l'offset alla fine fuso orario.
Che cosa si può fare è rimuovere manualmente il :
dall'offset fuso orario, in modo da ottenere una stringa che assomiglia a questo:
2010-12-15T16:26:49.841-0800
(si noti che compensato il fuso orario è -0800
invece di -08:00
). Quindi è possibile analizzarlo con SimpleDateFormat
con il formato yyyy-MM-dd'T'HH:mm:ss.SSSZ
.
Ma è meglio usare il popolare libreria Joda Time per i tempi di gestione e le date; è molto meglio rispetto al formato standard di Java API di data e calendario lezioni e le maniglie ISO 8601 in modo corretto.
Altri suggerimenti
Usa SimpleDateFormat, vedi javadocs qui:
Poi convertire la data di calendario. Date un'occhiata a un sacco di esempi qui:
Si può provare con questo pezzo di codice
DateTimeFormatter formatter =
DateTimeFormat.forPattern("your pattern").withOffsetParsed();
DateTime dateTime = formatter.parseDateTime("your input");
GregorianCalendar cal = dateTime.toGregorianCalendar();
Questo sicuramente vi darà l'oggetto Gregoriana Calendario
String dateTimeString="2010-12-15T16:26:49.841-08:00";
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
DateTime dateTime = formatter.parseDateTime(dateTimeString);
GregorianCalendar cal = dateTime.toGregorianCalendar();
Le altre risposte sono corrette, ma ora superata. Usano fastidiosi vecchie classi ora soppiantato dal quadro java.time.
Uso java.time
La stringa di input avviene per conformarsi alla ISO 8601 formattazione standard. Quindi non c'è bisogno di specificare uno schema di formattazione come le classi java.time utilizzano ISO 8601 per impostazione predefinita durante l'analisi / generazione di stringhe.
La stringa di input include un offset-da-UTC, quindi analizziamo come OffsetDateTime
.
String input = "2010-12-15T16:26:49.841-08:00" ;
OffsetDateTime odt = OffsetDateTime.parse( input );
Se si dispone di un tempo specifico orario in mente, piuttosto che un semplice compensato-da-UTC, applicare tale.
ZoneId zoneId = ZoneId.of( "America/Los_Angele" );
ZonedDateTime zdt = odt.atZone( zoneId );
GregorianCalendar
Si dovrebbe evitare le vecchie classi data-ora, come GregorianCalendar
. Ma se si deve interoperare con il vecchio codice non ancora aggiornato per java.time, è possibile convertire. Utilizzare nuovi metodi aggiunti alle vecchie classi per la conversione. Per ulteriori informazioni e un diagramma ingegnoso, vedere il mio Domanda e risposta .
Calendar cal = java.util.GregorianCalendar.from( zdt ); // Do such conversions out of java.time only if absolutely necessary.
A proposito di java.time
Il java.time quadro è integrato in Java 8 e versioni successive. Queste classi soppiantare le vecchie classi data-ora problematici, come java.util.Date
, .Calendar
, e java.text.SimpleDateFormat
.
Il Joda Time progetto, ora in modalità manutenzione , consiglia migrazione java.time.
Per ulteriori informazioni, vedere la Oracle Tutorial . E cercare Stack Overflow per molti esempi e spiegazioni.
La maggior parte delle funzionalità java.time è di back-porting per Java 6 & 7 a ThreeTen-Backport e in seguito atto a Android in ThreeTenABP .