2012-12-06 15 views
21

Jak sformatować javax.time.Instant jako ciąg w lokalnej strefie czasowej? Następujące tłumaczenie lokalny Instant do UTC, a nie do lokalnej strefy czasowej, jak się spodziewałem. Usunięcie połączenia z numerem toLocalDateTime() powoduje to samo. Jak mogę zamiast tego uzyskać czas lokalny?Jak sformatować plik javax.time.Instant jako ciąg w lokalnej strefie czasowej?

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

Uwaga: Używamy starszą wersję 0.6.3 realizacji JSR-310 odniesienia.

Odpowiedz

0

Przed dół głosować moją odpowiedź, proszę zauważyć, że kwestia wyraźnie (i pogrubioną czcionką) odnosi się do starej wersji 0.6.3 implementacji referencyjnej JSR-310! Zadałem to pytanie w grudniu 2012 roku, na długo przed pojawieniem się Java 8 i nowej biblioteki daty!


dałem się na JSR-310 klas DateTimeFormatter i ZonedDateTime a zamiast tego uciekają się do starej java.util.Date i 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

Naprawdę nie widzę potrzeby uciekania się do tego starego podejścia. –

+0

@ SimonAndréForsberg: Niestety musiałem, ponieważ używaliśmy 0.6.3 implementacji referencyjnej JSR-310. Na szczęście, mimo że nasz produkt nadal używa Java 7, od tego czasu przeszliśmy do najnowszego JSR-310, który pojawia się w Javie 8. –

+0

Data ma również metodę, Date.from (instant). Nwm, Zobacz swoją dziwną wersję teraz – softarn

6

Dlaczego miałbyś oczekiwać, że będzie korzystać z lokalnej strefy czasowej? Teraz wyraźnie domagając UTC:

ZonedDateTime.ofInstant(instant, TimeZone.UTC) 

Wystarczy określić swoją strefę czasową zamiast:

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

Spodziewałem się, że 'toLocalDateTime()' skonwertuje go do lokalnej lub domyślnej strefy czasowej. Najwyraźniej źle rozumiem, co robi 'toLocatlDateTime()'. Myślałem, że mogę utworzyć 'LocalDateTime', ale ta klasa nie ma metody, która konwertuje' Instant' na 'LocalDateTime'. –

+2

@DerekMahar: Lokalnie nie oznacza to, co myślisz, że to robi. Oznacza to tylko datę i godzinę, która nie jest związana z żadną określoną strefą czasową.Na przykład na całym świecie Nowy Rok rozpoczyna się o północy 1 stycznia. W każdym konkretnym roku jest to LocalDateTime - taki, który występuje w różnych * chwilach * dla różnych stref czasowych. –

+0

Niestety, JSR-310 nie używa 'java.util.TimeZone' i klasy' javax.time.calendar.TimeZone' w wersji 0.6.3 JSR-310 nie wydaje się mieć metodę 'getDefault()' lub jakakolwiek podobna metoda. –

34

odpowiedzi na to pytanie WRT niemal gotowego JDK1.8 wersję

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

Kluczem jest to, że Instant nie ma informacji o strefie czasowej jon. W związku z tym nie można go sformatować przy użyciu jakichkolwiek znaków na podstawie pól daty/czasu, takich jak "yyyyMMddHHmmss". Po określeniu strefy w numerze DateTimeFormatter, podczas formatowania natychmiast przekształcana jest ona w określoną strefę czasową, co umożliwia jej prawidłowe wyprowadzanie.

Alternatywnym rozwiązaniem jest konwersja do ZonedDateTime:

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

Oba podejścia są równoważne, jednak chciałbym ogólnie wybrać pierwszą, czy mój obiekt danych był Instant.

+0

Dziękuję za odpowiedź. Nie mam wątpliwości, że to prawda, ale będę musiał poczekać na kolejną okazję do zastosowania tego rozwiązania zamiast tego, które zaimplementowałem. Musiałbym też poczekać, aż nasz zespół zastąpi wersję 0.6.3 JSR-310 nowszą wersją lub zastąpi JDK 6 JDK 8. –

1

Spróbuj tego:

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

daje to:

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

Można zmienić format za pomocą czegoś innego niż DateTimeFormatter.ISO_ZONED_DATE_TIME jako formater. DateTimeFormatter ma kilka predefiniowanych formaterów lub możesz zdefiniować własne.

+0

Nie mogę znaleźć klasy 'ZoneId' w wersji 0.6.3 JSR -310 implementacja referencyjna. –

Powiązane problemy