2014-10-23 21 views
6

Sono abbastanza sorpreso di non aver ancora trovato un modo semplice considerando la frequenza con cui ISO8601 viene utilizzato in JSON.Come convertire il formato ISO8601 in millisecondi?

Fondamentalmente, sto prendendo una stringa simile a questa: 2014-10-23T00:35:14.800Z e convertendola in qualcosa come 50 minutes ago.

Prima di tutto, devo cambiare 2014-10-23T00:35:14.800Z a 2014-10-23'T'00:35:14.800Z, quindi ho bisogno di convertirlo in millisecondi, quindi è facile.

mio codice corrente:

private void setTimestamp(String timeCreated) { 
    int indexOfT = timeCreated.indexOf('T'); 

    String properFormat = new StringBuilder(timeCreated).insert(indexOfT + 1, "'") 
                 .insert(indexOfT, "'") 
                 .toString(); 

    timeStamp = (String) DateUtils.getRelativeTimeSpanString(Long.parseLong(properFormat), 
            System.currentTimeMillis(), 
            DateUtils.SECONDS_IN_MILLIS); 
} 

Il colpevole è Long.parseLong(properFormat). Devo convertire properFormat in millisecondi.

+0

Vedere [Tempo Joda] (http://joda-time.sourceforge.net/cal_iso.html). –

+1

Se si utilizza Java 8, è possibile trovare [questa discussione] (http://programmers.stackexchange.com/questions/225343/why-are-the-java-8-java-time-classes-missing-a-getmillis -metodo) interessante. –

+0

Per favore fatemi sapere perché avete downvoted questo. – David

risposta

6

tl; dr

Instant.parse("2014-10-23T00:35:14.800Z") 
     .toEpochMilli() 

One-Liner In java.time

Il quadro java.time è integrato in Java 8 e versioni successive. Queste nuove classi sostituiscono le vecchie classi data-ora in bundle con le prime versioni di Java come java.util.Date/.Calendar. Vedi Tutorial. Le classi java.time sostituiscono anche la fortunata libreria Joda-Time, che è stata costruita da alcune delle stesse persone, inclusa la guida dello stesso Stephen Colbourne.

Un Instant è un momento sulla sequenza temporale in UTC con una risoluzione di nanoseconds. È possibile ask it for a count of milliseconds dal suo epoch (primo momento del 1970 in UTC). Ma ricorda che uno Instant potrebbe avere dati aggiuntivi, mentre i nanosecondi sono più sottili di millisecondi. Quindi il tuo potrebbe perdere i dati in quella piccola frazione di una frazione di secondo.

Le classi java.time utilizzano i formati ISO 8601 standard durante l'analisi/generazione di stringhe. Non è necessario specificare un modello di formattazione. La classe Instant può directly parse una stringa.

Instant.parse("2014-10-23T00:35:14.800Z") 

È possibile convertire che per un conteggio di millisecondi fin dall'epoca primo momento del 1970 in UTC chiamando toEpochMilli

essere a conoscenza di eventuali perdite di dati come la classe Instant può contenere nanosecondi. Quindi l'estrazione di millisecondi troncerà ogni microsecondo o nanosecondo in qualsiasi secondo frazionario. La stringa di esempio ha solo tre cifre nel secondo frazionario, quindi solo millisecondi. Ma sei o nove cifre della frazione decimale verrebbero troncate a tre quando convertite in un conteggio di millisecondi.

long millisFromEpoch = Instant.parse("2014-10-23T00:35:14.800Z").toEpochMilli(); 

Per ottenere il tempo trascorso in termini di ore-minuti-secondi, utilizzare la classe Duration. Alimenta il suo metodo between un paio di momenti nel tempo.

Duration duration = Duration.between(Instant.parse("2014-10-23T00:35:14.800Z") , Instant.now()); 

One-Liner In Joda Time

UPDATE: Il progetto Joda-tempo è in modalità di manutenzione, con il team di consulenza di migrazione alle classi java.time.

Con la libreria Joda-Time 2.5:

long millisSinceEpoch = new DateTime("2014-10-23T00:35:14.800Z").getMillis(); 

Joda Time analizza e genera ISO 8601 stringhe per impostazione predefinita. Joda-Time funziona su Android. Le classi java.util.Date/.Calendar sono notoriamente fastidiose, confuse e imperfette. Evitalo.

+0

Penso che lo userò sicuramente. Sembra un one-liner fatto su misura per i miei appuntamenti. – David

+0

Down-voter: lascia una critica insieme al tuo voto, specialmente su una risposta accettata. –

2

Quindi, la risposta è stata più semplice di quanto avrei immaginato.

private void setTimestamp(String timeCreated) { 
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); 
    try { 
     Date timeCreatedDate = dateFormat.parse(timeCreated); 
     timeStamp = (String) DateUtils.getRelativeTimeSpanString(timeCreatedDate.getTime(), 
            System.currentTimeMillis(), 
            DateUtils.SECONDS_IN_MILLIS); 
    } catch (ParseException e) {} 
} 

Che funzionerà.

Problemi correlati