【问题标题】:Convert XMLGregorianCalendar in GMT to LocalDateTime Pacific time将 GMT 中的 XMLGregorianCalendar 转换为 LocalDateTime 太平洋时间
【发布时间】:2018-04-25 00:14:55
【问题描述】:

我正在尝试将以 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

我错过了什么?

【问题讨论】:

    标签: java java-8 java-time date-conversion


    【解决方案1】:

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

    【讨论】:

    • 感谢您的宝贵时间。我发现我应该在发布问题后使用withZoneSameInstant
    • 这对我不起作用。 ZonedDateTime utcZoned = xmlGregDate.toGregorianCalendar().toZonedDateTime().withZoneSameInstant(ZoneId.of("America/Los_Angeles")); LocalDateTime localDate = utcZoned.toLocalDateTime; localDate 与 xmlGregDate 保持一致!
    【解决方案2】:

    使用 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

    【讨论】:

    • 它所走的路线比您需要的要长(不过应该可以)。
    猜你喜欢
    • 2011-03-13
    • 2021-03-02
    • 2019-06-16
    • 2020-11-26
    • 1970-01-01
    • 2014-11-25
    • 2018-09-15
    • 2012-12-08
    • 2020-01-08
    相关资源
    最近更新 更多