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");
È stato utile?

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 .

Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un banco di prova per eventuali future integrazioni java.time. Si possono trovare alcune classi utili, come per esempio Interval, YearWeek, YearQuarter, e altro ancora.

scroll top