【问题标题】:How to set timestamp with zone in XMLGregorianCalendar如何在 XMLGregorianCalendar 中设置带区域的时间戳
【发布时间】:2023-03-23 08:48:01
【问题描述】:

我有这种格式的 DateTime '2020-11-08T13:05:46.000-07:00' 并尝试将其设置为 XMLGregorianCalendar。它会自动转换为2020-11-08T20:05:46.000+0000

是否将其保存为 UTC?

【问题讨论】:

    标签: java utc timestamp-with-timezone xmlgregoriancalendar


    【解决方案1】:

    tl;博士

    OffsetDateTime
    .parse( "2020-11-08T13:05:46.000-07:00" )
    .toInstant() 
    

    java.time

    XMLGregorianCalendar 是一个遗留类,几年前被ZonedDateTime 取代。

    您的输入没有时区,只有与 UTC 的偏移量。所以将该字符串解析为OffsetDateTime

    OffsetDateTime odt = OffsetDateTime.parse( "2020-11-08T13:05:46.000-07:00" ) ;
    

    调整到 UTC(零时分秒的偏移量)的最简单方法是提取 Instant

    Instant instant = odt.toInstant() ;
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      import javax.xml.datatype.DatatypeConfigurationException;
      import javax.xml.datatype.DatatypeFactory;
      import javax.xml.datatype.XMLGregorianCalendar;
      
      public class Main {
          public static void main(String[] args) throws DatatypeConfigurationException {
              String givenDateTimeString = "2020-11-08T13:05:46.000-07:00";
              XMLGregorianCalendar xmlGregorianCalendar = DatatypeFactory.newInstance()
                      .newXMLGregorianCalendar(givenDateTimeString);
              System.out.println(xmlGregorianCalendar);
          }
      }
      

      输出:

      2020-11-08T13:05:46.000-07:00
      

      不过,我建议你切换到modern date-time API

      使用现代日期时间 API:

      import java.time.OffsetDateTime;
      import java.time.ZoneOffset;
      import java.time.format.DateTimeFormatter;
      import java.util.Locale;
      
      public class Main {
          public static void main(String[] args) {
              String givenDateTimeString = "2020-11-08T13:05:46.000-07:00";
              OffsetDateTime odt = OffsetDateTime.parse(givenDateTimeString);
              // Default format i.e. OffsetDateTime#toString
              System.out.println(odt);
      
              // Custom format
              System.out.println(odt.format(DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ENGLISH)));
      
              // Convert it to date-time at UTC
              OffsetDateTime odtUTC = odt.withOffsetSameInstant(ZoneOffset.UTC);
              System.out.println(odtUTC);
              System.out.println(odtUTC.format(DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSX", Locale.ENGLISH)));
          }
      }
      

      输出:

      2020-11-08T13:05:46-07:00
      2020-11-08T13:05:46.000-07:00
      2020-11-08T20:05:46Z
      2020-11-08T20:05:46.000Z
      

      通过 Trail: Date Time 了解有关现代日期时间 API 的更多信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-26
        • 1970-01-01
        • 1970-01-01
        • 2014-10-15
        • 2016-10-09
        • 2018-06-27
        • 2013-09-22
        相关资源
        最近更新 更多