簡體   English   中英

從XMLGregorianCalendar獲取日期

[英]Fetching Date from XMLGregorianCalendar

我一直在進行需要從XMLGregorianCalendar提取日期的任務,已將其轉換為GregorianCalendar並嘗試從中獲取日期,但是我看到存儲在XMLGregorianCalendar中的原始日期與從toGregorianCalendar獲取的日期之間的區別,我想要日期為格式為UTC,源時區也為UTC。請找到代碼段以供參考。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ";
sdf.setTimeZone(TimeZone.getTimeZone("UTC"))
String date = sdf.format(xmlGregorianCalendar.toGregorianCalendar().getTime());

我想知道是否有任何方法可以從帶有UTC時區的XMLGregorianCalendar中獲取日期,並且沒有任何時差。以下是存儲在XMLGregorianCalendar中的示例源日期

2018-07-06T05:11:00.050Z

我用SimpleDateFormat格式化后,期望與字符串完全相同的日期。非常感謝您的幫助,在此先感謝您!

    OffsetDateTime dateTime = xmlGregorianCalendar.toGregorianCalendar()
            .toZonedDateTime()
            .toOffsetDateTime();
    System.out.println("Date-time with explicit offset: " + dateTime);
    System.out.println("Offset is " + dateTime.getOffset());

使用您的XMLGregorianCalendar打印:

Date-time with explicit offset: 2018-07-06T05:11:00.050Z
Offset is Z

Z表示UTC或偏移零或Zulu時區。 因此,這為您提供了帶有明確偏移量的UTC日期和時間。

如果您真正需要的只是正確的時間點,通常可以使用Instant

    Instant pointInTime = xmlGregorianCalendar.toGregorianCalendar()
            .toZonedDateTime()
            .toInstant();
    System.out.println("As point in time: " + pointInTime);

輸出:

As point in time: 2018-07-06T05:11:00.050Z

您會注意到日期和時間的打印與之前一樣,包括Z表示UTC。 區別在於: OffsetDateTime可以保存任何偏移量(如果XMLGregorianCalendar可以,則可以保留不同的偏移量)。 Instant被認為是與任何區域或偏移量無關的時間點。 只有使用UTC打印日期和時間的toString方法,后綴對於UTC始終為Z

您的代碼出了什么問題?

首先, SimpleDateFormat類不僅已過時。 眾所周知,它也很麻煩,特別是在解析時,但仍然如此。 TimeZone也已過時。 正如我在上面的代碼片段中所做的java.time ,您將更喜歡使用現代的Java日期和時間API java.time

我運行了您的代碼並得到2018-07-06T05:11:00.050+0000 與UTC的零偏移量以不同的方式打印,但是字符串與您想要的內容一致。

您不能具有帶有時區或偏移量的java.util.Date (另一個過時的類)。 它代表一個時間點,僅此而已。

鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM