2014-11-21 25 views
6

ho una stringa di dataConversione data ISO8601 per unix timestamp in java

String s = "2014-09-01T19:22:43.000Z"; 
    Date date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").parse(s); 

Ma ottengo un'eccezione:

Exception in thread "main" java.text.ParseException: Unparseable date: "2014-09-01T19:22:43.000Z" 

Come faccio a convertire la stringa qui sopra per unix timestamp? Grazie

+0

FYI, le fastidiose classi di data e ora come ['java.util.Date'] (https://docs.oracle.com/javase/9/docs/api/java/util/Date.html) , ['java.util.Calendar'] (https://docs.oracle.com/javase/9/docs/api/java/util/Calendar.html) e' java.text.SimpleDateFormat' sono ora [legacy] (https://en.wikipedia.org/wiki/Legacy_system), soppiantati dal [java.time] (https://docs.oracle.com/javase/9/docs/api/ java/time/package-summary.html) classi integrate in Java 8 e Java 9. Vedi [Tutorial di Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

risposta

6

X viene utilizzato per ISO 8601 time zone in SimpleDateFormat, non Z

formato corretto è "yyyy-MM-dd'T'HH:mm:ss.SSSX"

+1

Gratta che. 'X' analizza' Z' come Zulu. –

6

tl; dr

Come faccio a convertire la stringa qui sopra per unix timestamp?

Instant.parse("2014-09-01T19:22:43.000Z") 
     .getEpochSecond() 

java.time

La classe java.time.Instant in grado di analizzare la stringa di input con il suo formato standard ISO 8601. Non è necessario specificare un modello di formattazione.

Instant instant = Instant.parse("2014-09-01T19:22:43.000Z"); 

Per ottenere un conteggio di millisecondi dall'epoca del 1970:

long millisecondsSinceUnixEpoch = instant.toEpochMilli() ; 

Per interi secondi dal periodo di 1970-01-01T00: 00: 00Z:

long secondsSinceUnixEpoch = instant.getEpochSecond() ; 

Be a conoscenza di possibile perdita di dati quando si passa a millisecondi o interi secondi. Le classi java.time hanno una risoluzione di nanosecondi, quindi qualsiasi microsecondo o nanosecondo presente nel valore verrà troncato.

Joda Time

Aggiornamento Il progetto Joda Time è ora in modalità di manutenzione. Il team consiglia la migrazione alle classi java.time.

La libreria Joda-Time facilita questo lavoro. La stringa compatibile ISO 8601 può essere inviata direttamente a un costruttore Joda-Time. Il parser built-in si aspetta ISO 8601.

DateTime dateTime = new DateTime("2014-09-01T19:22:43.000Z") ; 

Unix timestamp

Che cosa si intende per un timestamp Unix? Alcune persone indicano un conteggio di interi secondi dal primo momento del 1970 UTC (Unix epoch) ignorando i secondi bisestili (vedere Unix Time). Alcune persone significano un conteggio di millisecondi o altra risoluzione.

Nota l'uso di una primitiva long anziché la più comune int.

Per millisecondi, chiamare getMillis().

long millisecondsSinceUnixEpoch = dateTime.getMillis(); 

Per interi secondi, dividere per 1.000. Considerare se si desidera arrotondare o troncare i secondi frazionari.


Normalmente suggerirei di passare un oggetto DateTimeZone con la stringa al costruttore DateTime. Ma non c'è bisogno se tutto ciò che vuoi è un conteggio dall'epoca.


Chi java.time

Il quadro java.time è costruito in Java 8 e versioni successive. Queste classi soppiantano le fastidiose classi di data legacy come java.util.Date, Calendar, & SimpleDateFormat.

Il progetto Joda-Time, ora in maintenance mode, consiglia la migrazione alle classi java.time.

Per ulteriori informazioni, vedere Oracle Tutorial. 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 più tardi
    • incorporato.
    • 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
    • Molte delle funzionalità java.time è di back-porting per Java 6 .
  • Android
    • versioni successive di implementazioni fascio Android delle classi java.time.
    • Per Android precedente, il progetto ThreeTenABP si adatta a ThreeTen-Backport (menzionato sopra). Vedi How to use ThreeTenABP….

Il progetto ThreeTen-Extra java.time prolunga 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 more.