2017-11-12 16 views
2

그리니치 표준시/UTC 형식으로 전송되는 XMLGregorianCalendar를 America/Los_Angeles 시간대의 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

필요한 경로보다 길어집니다 (그래도 작동해야합니다). –