Parsing ISO-8601 DateTime in java

Ho un problema con l’ora della data di analisi in Java, ho uno strano formato di data e ora. Come posso analizzare 2013-04-03T17:04:39.9430000+03:00 data ora in java per formattare dd.MM.yyyy HH:mm in java?

Il formato “strano” in questione è ISO-8601 – è molto usato. Puoi utilizzare SimpleDateFormat per riformattarlo nel modo che preferisci:

 SimpleDateFormat inFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); DateTime dtIn = inFormat.parse(dateString}); //where dateString is a date in ISO-8601 format SimpleDateFormat outFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm"); String dtOut = outFormat.format(dtIn); //parse it into a DateTime object if you need to interact with it as such 

ti darà il formato che hai menzionato.

tl; dr

 OffsetDateTime.parse( "2013-04-03T17:04:39.9430000+03:00" ).format( DateTimeFormatter.ofPattern( "dd.MM.uuuu HH:mm" ) ) 

ISO 8601

Come hanno notato gli altri, il tuo formato non è affatto strano. In effetti è un formato standard. Questo formato è uno di una collezione definita dal formato ISO 8601 .

microsecondi

Le sette cifre di una frazione decimale di secondo, .9430000 , rappresentano i nanosecondi . Le vecchie classi data-ora in bundle con le prime versioni di Java (java.util.Date/.Calendar/java.text.SimpleDateFormat) sono create solo per millisecondi (tre cifre della frazione decimale). Tali valori di input non possono essere gestiti dalle vecchie classi.

java.time

Fortunatamente Java ora ha nuove classi data-ora che soppiantano quelle vecchie classi. I nuovi sono nel framework java.time . Queste nuove classi possono gestire i nanosecondi (fino a nove cifre della frazione decimale), quindi non ci sono problemi.

Il framework java.time è integrato in Java 8 e versioni successive. Definito in JSR 310 . Gran parte delle funzionalità è supportata da Java 6 e 7 nel progetto ThreeTen-Backport e ulteriormente adattata per Android nel progetto ThreeTenABP .

OffsetDateTime

Un OffsetDateTime rappresenta un momento sulla timeline con un offset da UTC . La stringa di immissione, 2013-04-03T17:04:39.9430000+03:00 , ha un offset che è tre ore prima di UTC .

Le classi java.time utilizzano i formati ISO 8601 per impostazione predefinita durante l’analisi / generazione di stringhe. Quindi non c’è bisogno di definire un modello di formattazione. Possiamo analizzare direttamente quella stringa.

 OffsetDateTime odt = OffsetDateTime.parse( "2013-04-03T17:04:39.9430000+03:00" ); 

Generazione di stringhe

Per generare una rappresentazione di stringa nello stesso stile, chiama il suo metodo toString .

Per un formato diverso, definire un modello di formattazione.

 DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "dd.MM.uuuu HH:mm" ); String output = odt.format( formatter ); 

Fuso orario

Nota che il tuo input ha un offset da UTC ma non un vero fuso orario. Un fuso orario è un offset più regole per la gestione di anomalie come l’ora legale (DST). Per un vero fuso orario utilizzare ZoneId per ottenere un ZonedDateTime . Ricerca overflow dello stack per molti esempi.


A proposito di java.time

Il framework java.time è integrato in Java 8 e versioni successive. Queste classi soppiantano le fastidiose vecchie lezioni di data e ora come java.util.Date , Calendar e SimpleDateFormat .

Il progetto Joda-Time , ora in modalità di manutenzione , consiglia la migrazione alle classi java.time .

Per saperne di più, consultare l’ esercitazione Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .

È ansible scambiare oggetti java.time direttamente con il proprio database. Utilizzare un driver JDBC compatibile con JDBC 4.2 o successivo. Nessuna necessità di stringhe, nessuna necessità per le classi java.sql.* .

Dove ottenere le classi java.time?

  • Java SE 8 , Java SE 9 , Java SE 10 e versioni successive
    • Built-in.
    • 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
    • Gran parte della funzionalità java.time è back-porting su Java 6 e 7 in ThreeTen-Backport .
  • android
    • Versioni successive di implementazioni di bundle Android delle classi java.time.
    • Per Android precedente (<26), il progetto ThreeTenABP adatta ThreeTen-Backport (menzionato sopra). Vedi Come usare ThreeTenABP ….

Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un terreno di prova per possibili aggiunte future a java.time. Puoi trovare alcune classi utili come Interval , YearWeek , YearQuarter e altro .

Per un lavoro serio con data e ora in java suggerirei di usare un’implementazione migliore di quella del calendario . Vorrei usare Joda , e qui puoi usare DateTimeFormatter

Utilizzare questo metodo per analizzare la data ISO8601 senza alcuna libreria. http://www.java2s.com/Code/Java/Data-Type/ISO8601dateparsingutility.htm

 public static Date parseISO8601Date(String input ) throws java.text.ParseException { //NOTE: SimpleDateFormat uses GMT[-+]hh:mm for the TZ which breaks //things a bit. Before we go on we have to repair this. SimpleDateFormat df = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ssz" ); //this is zero time so we need to add that TZ indicator for if ( input.endsWith( "Z" ) ) { input = input.substring( 0, input.length() - 1) + "GMT-00:00"; } else { int inset = 6; String s0 = input.substring( 0, input.length() - inset ); String s1 = input.substring( input.length() - inset, input.length() ); input = s0 + "GMT" + s1; } return df.parse( input ); }