2014-10-23 12 views
6

Ich bin ziemlich überrascht, dass ich noch keinen wirklich einfachen Weg gefunden habe, wenn man bedenkt, wie oft ISO8601 in JSON verwendet wird.Wie konvertiert man das ISO8601-Format in Millisekunden?

Grundsätzlich nehme ich eine Zeichenfolge, die wie folgt aussieht: 2014-10-23T00:35:14.800Z und konvertiert es in etwas wie 50 minutes ago.

Zuerst muss ich 2014-10-23T00:35:14.800Z zu 2014-10-23'T'00:35:14.800Z ändern, dann muss ich es in Millisekunden konvertieren, dann ist es einfach.

Mein aktueller Code:

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); 
} 

Der Täter ist Long.parseLong(properFormat). Ich muss properFormat in Millisekunden umwandeln.

+0

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

+1

Wenn Sie Java 8 verwenden, finden Sie möglicherweise [diese Diskussion] (http://programmers.stackexchange.com/questions/225343/why-are-the-java-8-java-time-classes-missing-a-getmillis (Methode) interessant. –

+0

Bitte lassen Sie mich wissen, warum Sie dies abgelehnt haben. – David

Antwort

6

tl; dr

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

One-Liner In java.time

Der java.time Rahmen in Java 8 gebaut und später. Diese neuen Klassen ersetzen die alten Datums- und Uhrzeitklassen, die mit den frühesten Versionen von Java gebündelt sind, wie java.util.Date/.Calendar. Siehe Tutorial. Die java.time-Klassen ersetzen auch die sehr erfolgreiche Joda-Time-Bibliothek, die von einigen der gleichen Leute gebaut wird, einschließlich der von der gleichen Stephen Colbourne geführt wird.

Ein Instant ist ein Moment auf der Timeline in UTC mit einer Auflösung von nanoseconds. Sie können ask it for a count of milliseconds von seinem epoch (erster Moment von 1970 in UTC). Aber denken Sie daran, dass ein Instant zusätzliche Daten haben kann, wobei Nanosekunden feiner als Millisekunden sind. So können Sie Daten in diesem winzigen Bruchteil eines Bruchteils einer Sekunde verlieren.

Die java.time-Klassen verwenden Standard-ISO-8601-Formate beim Parsen/Erzeugen von Strings. Sie müssen kein Formatierungsmuster angeben. Die Instant Klasse kann directly parse eine Zeichenfolge.

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

Sie können, dass seit der Epoche der ersten Moment des Jahres 1970 in UTC, um eine Anzahl von Millisekunden zu konvertieren, indem toEpochMilli Aufruf

bewusst sein, einen möglichen Datenverlust als Instant Klasse kann ns halten. Wenn Sie also Millisekunden extrahieren, werden alle Mikrosekunden oder Nanosekunden in einer Bruchteilsekunde abgeschnitten. Ihre Beispielzeichenfolge hat nur drei Stellen in der Bruchteilsekunde, also nur Millisekunden. Aber sechs oder neun Ziffern des Dezimalbruches würden auf drei abgeschnitten werden, wenn sie in eine Anzahl von Millisekunden konvertiert werden.

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

Um Zeit in Stunden-Minuten-Sekunden, verwenden Sie die Duration Klasse erhalten abgelaufen ist. Feed seine between Methode ein paar Momente in der Zeit.

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

One-Liner In Joda-Time

UPDATE: Das Joda-Time-Projekt ist im Wartungsmodus, mit dem Team der Migration in den java.time Klassen zu beraten.

Mit der Joda-Time 2.5 Bibliothek:

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

Joda-Time analysiert und generiert ISO 8601 Strings standardmäßig. Joda-Time funktioniert in Android. Die java.util.Date/.Calendar-Klassen sind bekanntermaßen mühsam, verwirrend und fehlerhaft. Vermeide sie.

+0

Ich denke, ich werde das definitiv verwenden. Scheint wie ein One-Liner maßgeschneidert für meine Termine. – David

+0

Down-Wähler: Bitte hinterlassen Sie eine Kritik mit Ihrer Stimme, besonders auf eine angenommene Antwort. –

2

So stellt sich heraus, die Antwort war einfacher als ich es mir vorgestellt hatte.

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) {} 
} 

Das wird funktionieren.

Verwandte Themen