Qual è il formato di questa data? 2011-08-12T20: 17: 46.384Z

Ho la seguente data: 2011-08-12T20:17:46.384Z . Che formato è questo? Sto cercando di analizzarlo con Java 1.4 tramite DateFormat.getDateInstance().parse(dateStr) e sto ottenendo

java.text.ParseException: Data non analizzabile: “2011-08-12T20: 17: 46.384Z”

Penso che dovrei usare SimpleDateFormat per l’analisi, ma prima devo conoscere la stringa di formato. Tutto quello che ho finora è yyyy-MM-dd , perché non so cosa significhi il T in questa stringa – qualcosa legato al fuso orario? Questa stringa di data proviene dal file lcmis:downloadedOn mostrato sul tipo di file di cronologia dei download di file CMIS .

Il T è solo un letterale per separare la data dal momento, e la Z significa “offset a ore zero” noto anche come “Zulu time” (UTC). Se le tue stringhe hanno sempre una “Z” puoi usare:

 SimpleDateFormat format = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US); format.setTimeZone(TimeZone.getTimeZone("UTC")); 

O usando Joda Time , puoi usare ISODateTimeFormat.dateTime() .

tl; dr

Il formato standard ISO 8601 viene utilizzato dalla stringa di input.

 Instant.parse ( "2011-08-12T20:17:46.384Z" ) 

ISO 8601

Questo formato è definito dallo standard pratico ragionevole ISO 8601 .

La T separa la parte della data dalla porzione dell’ora. La Z alla fine è l’abbreviazione di Zulu e significa UTC .

java.time

Le vecchie lezioni di data-ora in bundle con le prime versioni di Java si sono dimostrate poco progettate, confuse e problematiche. Evitalo.

Utilizzare invece il framework java.time incorporato in Java 8 e versioni successive. Le classi java.time sostituiscono sia le vecchie classi data-ora sia la libreria Joda-Time di grande successo.

Le classi java.time utilizzano ISO 8601 per impostazione predefinita durante l’analisi / generazione di rappresentazioni testuali di valori di data e ora.

La class Instant rappresenta un momento sulla timeline in UTC con una risoluzione di nanosecondi . Quella class può analizzare direttamente la stringa di input senza preoccuparsi di definire un modello di formattazione.

 Instant instant = Instant.parse ( "2011-08-12T20:17:46.384Z" ) ; 

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 .

Dove ottenere le classi java.time?

  • Java SE 8 , Java SE 9 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, 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 .

Non sono sicuro dell’analisi di Java, ma questo è ISO8601: http://en.wikipedia.org/wiki/ISO_8601

Ci sono altri modi per analizzarlo piuttosto che la prima risposta. Per analizzarlo:

(1) Se si desidera ottenere informazioni su data e ora, è ansible analizzarlo su un object ZonedDatetime (da Java 8 ) o Date (vecchio):

 // ZonedDateTime's default format requires a zone ID(like [Australia/Sydney]) in the end. // Here, we provide a format which can parse the string correctly. DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE_TIME; ZonedDateTime zdt = ZonedDateTime.parse("2011-08-12T20:17:46.384Z", dtf); 

o

 // 'T' is a literal. // 'X' is ISO Zone Offset[like +01, -08]; For UTC, it is interpreted as 'Z'(Zero) literal. String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX"; // since no built-in format, we provides pattern directly. DateFormat df = new SimpleDateFormat(pattern); Date myDate = df.parse("2011-08-12T20:17:46.384Z"); 

(2) Se non ti interessa la data e l’ora e vuoi solo trattare le informazioni come un momento in nanosecondi, allora puoi usare Instant :

 // The ISO format without zone ID is Instant's default. // There is no need to pass any format. Instant ins = Instant.parse("2011-08-12T20:17:46.384Z"); 

Il modo più semplice per risolverlo è sostituire la "T" con " " e rimuovere .384Z .

Di seguito è riportata un’illustrazione di come ottenere ciò:

 public static String getTime(String time) { if (time != null) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); if (time.toUpperCase().contains("T") && time.toUpperCase().contains("Z")) { time = time.toUpperCase().replace("T", " "); String[] str = time.split("\\."); if (str.length != 0) { return str[0]; } } try { Date date = new Date(time); time = simpleDateFormat.format(date); } catch (Exception e) { // } } return time; }