2017-11-12 21 views
2

GMT/UTC形式で送信されたXMLGregorianCalendarを、アメリカ/ロサンゼルスのタイムゾーンであるJava 8 LocalDateTimeに変換しようとしています。GMTからLocalDateTimeにXMLGregorianCalendarを変換する太平洋時間

ここは私が試したもので、太平洋時間に変換された時間は得られませんでした。

//xmlDate is 2017-11-13T00:00:00Z 
ZonedDateTime zDateTime = xmlDate.toGregorianCalendar().toZonedDateTime().toLocalDateTime().atZone(ZoneId.of("America/Los_Angeles")); 
LocalDateTime localDateTime = zDateTime.toLocalDateTime(); 
//Expected localDateTime is 2017-11-12T16:00. But I only get 2017-11-13T00:00 

何が欠けていますか?

答えて

3

atZone()あなたはそう思わないと思います。それは単に時刻に瞬間を保存せずに日付にアタッチするだけです。明確に日付と時刻のフォーマットを定義するために

public static void main(String[] args) throws Exception { 
    XMLGregorianCalendar xc = DatatypeFactory.newInstance().newXMLGregorianCalendar(2017, 10, 13, 0, 0, 0, 0, 0); 
    System.out.println(xc); 
    GregorianCalendar gc = xc.toGregorianCalendar(); 
    System.out.println(gc); 
    ZonedDateTime zdt = gc.toZonedDateTime(); 
    System.out.println(zdt); 
    LocalDateTime ldt = zdt.withZoneSameInstant(ZoneId.of("America/Los_Angeles")).toLocalDateTime(); 
    System.out.println(ldt); 
} 
+0

感謝。私は質問を投稿した後に 'withZoneSameInstant'を使用するべきであることを理解しました。 – jusermar10

0

使ってDateTimeFormatterパターン、および定義されたzoneidを持つ:あなたがインスタントを保持し、ゾーンを変更するZonedDateTime#withZoneSameInstant()を使用して、それを行う必要があります。

String xmlDate = "2017-11-13T00:00:00Z"; 

DateTimeFormatter formatInput =DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'").withZone(ZoneId.of("UTC")); 
DateTimeFormatter formatOutput =DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm").withZone(ZoneId.of("America/Los_Angeles")); 

ZonedDateTime zoned = ZonedDateTime.parse(xmlDate,formatInput); 

System.out.println("Output date and time: "+formatOutput.format(zoned)); 

出力日時:2017-11-12T16:お時間を00

+0

あなたが必要とするよりも長いルートを取っています(ただし、動作するはずです)。 –

関連する問題