2016-01-05 16 views
16

Mam czas z typem ciągu, na przykład: "2015-01-05 17:00" i ZoneId jest "Australia/Sydney".Java 8 Konwertuj daną strefę czasową i czasową na czas UTC

Jak przekonwertować te informacje o czasie do czasu UTC przy użyciu interfejsu API datetime Java 8?

Należy również uwzględnić materiały DST.

+1

Co rozumiesz przez "czas UTC"? Czy chcesz uzyskać wersję błyskawiczną? lub java.sql.Date? Czy liczba millis od epoki? – assylias

Odpowiedz

32

Szukasz klasy ZonedDateTime w języku Java8 - pełna data-godzina ze strefą czasową i rozwiązanym przesunięciem z UTC/Greenwich. Pod względem projektu klasa ta powinna być postrzegana przede wszystkim jako połączenie LocalDateTime i ZoneId. Numer ZoneOffset jest istotną, ale drugorzędną informacją, używaną w celu zapewnienia, że ​​klasa reprezentuje natychmiast, szczególnie w przypadku nakładania się nakładek na światło dzienne.

Na przykład:

ZoneId australia = ZoneId.of("Australia/Sydney"); 
String str = "2015-01-05 17:00"; 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); 
LocalDateTime localtDateAndTime = LocalDateTime.parse(str, formatter); 
ZonedDateTime dateAndTimeInSydney = ZonedDateTime.of(localtDateAndTime, australia); 

System.out.println("Current date and time in a particular timezone : " + dateAndTimeInSydney); 

ZonedDateTime utcDate = dateAndTimeInSydney.withZoneSameInstant(ZoneOffset.UTC); 

System.out.println("Current date and time in UTC : " + utcDate); 
+1

Wydaje się, że ten wynik nie jest tym, czego chcę. Chcę przekonwertować na czas UTC i przechowywać czas UTC w mojej bazie danych. ZonedDateTime nie jest tym, czego chcę i nie mogę odwzorować na typ kolumny DB. – ttt

+2

Przepraszamy, dodałem konwersję do UTC w przykładzie. –

+2

Fajnie, wydaje się, że musimy przekonwertować LocalDateTime na ZonedDateTime, a następnie możemy przekonwertować między różnymi strefami czasowymi. Dzięki. – ttt

15

Alternatywą dla istniejącego odpowiedź jest ustawienie formater z odpowiedniej strefy czasowej:

String input = "2015-01-05 17:00"; 
ZoneId zone = ZoneId.of("Australia/Sydney"); 

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").withZone(zone); 
ZonedDateTime utc = ZonedDateTime.parse(input, fmt).withZoneSameInstant(UTC); 

Ponieważ chcesz interakcji z bazą danych, może być konieczne a java.sql.Timestamp, w takim przypadku nie trzeba jawnie konwertować na czas UTC, ale można użyć natychmiastowego:

ZonedDateTime zdt = ZonedDateTime.parse(input, fmt); 
Timestamp sqlTs = Timestamp.from(zdt.toInstant()); 
+0

Co to jest zmienna UTC w tym kontekście? – BOWS

+1

To jest data/czas w strefie czasowej UTC, która odpowiada tej samej chwili co "wejście" w Sydney. W tym przypadku będzie to ta sama data, ale o 6 rano. – assylias

0
**// Refactored Logic**  

     ZoneId australia = ZoneId.of("Australia/Sydney"); 
     ZoneId utcZoneID= ZoneId.of("Etc/UTC"); 
     String ausTime = "2015-01-05 17:00"; 
     DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); 

     //converting in datetime of java8 
     LocalDateTime ausDateAndTime = LocalDateTime.parse(ausTime, formatter); 

     // DateTime With Zone 
     ZonedDateTime utcDateAndTime = ausDateAndTime.atZone(utcZoneID); 
     // output - 2015-01-05T17:00Z[Etc/UTC] 

     // With Formating DateTime 
     String utcDateTime = utcDateAndTime.format(formatter); 
     // output - 2015-01-05 17:00 
Powiązane problemy