2012-12-06 3 views
21

Wie formatiere ich eine javax.time.Instant als Zeichenfolge in der lokalen Zeitzone? Das folgende übersetzt eine lokale Instant zu UTC, nicht zu der lokalen Zeitzone, wie ich erwartet hatte. Das Entfernen des Anrufs zu toLocalDateTime() macht das gleiche. Wie kann ich stattdessen die Ortszeit bekommen?Wie formatiere ich eine javax.time.Instant als Zeichenfolge in der lokalen Zeitzone?

public String getDateTimeString(final Instant instant) 
{ 
    checkNotNull(instant); 
    DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder(); 
    DateTimeFormatter formatter = builder.appendPattern("yyyyMMddHHmmss").toFormatter(); 
    return formatter.print(ZonedDateTime.ofInstant(instant, TimeZone.UTC).toLocalDateTime()); 
} 

Hinweis: Wir verwenden die ältere Version 0.6.3 der JSR-310 Referenzimplementierung.

Antwort

0

Bevor Sie nach unten meine Antwort stimmen, bitte beachten Sie, dass die Frage ausdrücklich (und in Fettschrift) bezieht sich auf die alte Version 0.6.3 der Referenzimplementierung JSR-310! Ich habe diese Frage im Dezember 2012 gestellt, lange vor der Ankunft von Java 8 und der neuen Datumsbibliothek!


Ich gab auf JSR-310 Klassen DateTimeFormatter und ZonedDateTime und griffen stattdessen zu altmodischen java.util.Date und java.text.SimpleDateFormat:

public String getDateTimeString(final Instant instant) 
{ 
    checkNotNull(instant); 
    DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); 
    Date date = new Date(instant.toEpochMillisLong()); 
    return format.format(date); 
} 
+0

Ich sehe wirklich nicht die Notwendigkeit, auf diesen alten Ansatz zurückgreifen. –

+0

@ SimonAndréForsberg: Leider musste ich, weil wir 0,6.3 der JSR-310-Referenzimplementierung verwendet haben. Obwohl unser Produkt immer noch Java 7 verwendet, haben wir uns seither auf den neuesten JSR-310, der in Java 8 erscheint, gewendet. –

+0

Date hat auch eine Methode, Date.from (instant). Nwm, sehen Sie Ihre seltsame Version jetzt – softarn

6

Warum würden Sie es erwarten, dass die lokale Zeitzone zu benutzen? Sie fragen explizit UTC:

ZonedDateTime.ofInstant(instant, TimeZone.UTC) 

Sie Ihre lokale Zeitzone angeben statt:

ZonedDateTime.ofInstant(instant, TimeZone.getDefault()) 
+0

Ich erwartete 'toLocalDateTime()', um es in die lokale oder Standardzeitzone zu konvertieren. Anscheinend missverstehe ich was 'toLocatlDateTime()' tut. Ich dachte, ich könnte eine "LocalDateTime" erstellen, aber diese Klasse hat keine Methode, die ein 'Instant' in ein' LocalDateTime' konvertiert. –

+2

@DerekMahar: Lokal bedeutet nicht, was Sie denken, dass es im Grunde tut. Es bedeutet nur ein Datum und eine Uhrzeit, die keiner bestimmten Zeitzone zugeordnet sind.So beginnt beispielsweise rund um die Welt das neue Jahr am 1. Januar um Mitternacht. Für jedes bestimmte Jahr ist das eine LocalDateTime - eine, die zu verschiedenen Zeitpunkten * für verschiedene Zeitzonen auftritt. –

+0

Leider verwendet JSR-310 nicht 'java.util.TimeZone' und die Klasse' javax.time.calendar.TimeZone' in Version 0.6.3 von JSR-310 scheint nicht die Methode 'getDefault()' oder zu haben jede ähnliche Methode. –

34

diese Frage WRT Die Beantwortung der fast fertig JDK1.8 Version

DateTimeFormatter formatter = 
    DateTimeFormatter.ofPattern("yyyyMMddHHmmss").withZone(ZoneId.systemDefault()); 
return formatter.format(instant); 

Der Schlüssel ist, dass Instant keine Zeitzone informat hat Ion. Daher kann es nicht mit irgendwelchen Mustern basierend auf Datums-/Zeitfeldern wie "yyyyMMddHHmmss" formatiert werden. Durch Angabe der Zone in wird der Zeitpunkt während der Formatierung in die angegebene Zeitzone konvertiert, sodass er korrekt ausgegeben werden kann.

Ein alternativer Ansatz ist zu ZonedDateTime konvertieren:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); 
return formatter.format(ZonedDateTime.ofInstant(instant, ZoneId.systemDefault())); 

Beiden Ansätze sind gleichwertig, aber ich in der Regel die ersten wählen würde, wenn mein Datenobjekt ein Instant ist.

+0

Vielen Dank für die Antwort. Ich habe wenig Zweifel, dass es richtig ist, aber ich werde auf die nächste Gelegenheit warten müssen, um diese Lösung anstelle von der, die ich implementiert habe, anzuwenden. Ich würde auch warten müssen, bis unser Team Version 0.6.3 von JSR-310 durch eine neuere Version ersetzt oder JDK 6 durch JDK 8 ersetzt. –

1

Try this:

String dateTime = DateTimeFormatter.ISO_ZONED_DATE_TIME.format(
    ZonedDateTime.ofInstant(instant, ZoneId.systemDefault()) 
); 

Das gibt:

2014-08-25T21:52:07-07:00[America/Los_Angeles] 

Sie das Format unter Verwendung von etwas anderes als DateTimeFormatter.ISO_ZONED_DATE_TIME als Formatierer ändern können. DateTimeFormatter hat eine Reihe vordefinierter Formatierer, oder Sie können Ihre eigenen definieren.

+0

Ich finde die Klasse 'ZoneId' in Version 0.6.3 des JSR nicht -310 Referenzimplementierung. –

Verwandte Themen