我正在尝试将以GMT / UTC格式发送的XMLGregorianCalendar转换为America / Los_Angeles时区中的Java 8 LocalDateTime而没有运气。
这是我尝试过的,无法将时间转换为太平洋时间。
//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
我错过了什么?
答案 0 :(得分:6)
atZone()
没有按照您的想法行事。它只是将时区附加到日期而不保留瞬间。您必须使用ZonedDateTime#withZoneSameInstant()
来保持即时并修改区域:
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);
}
答案 1 :(得分:-1)
使用DateTimeFormatter模式清楚地定义日期和时间格式,并使用已定义的zoneId。
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