0

我一直在处理需要从 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 格式化后,我期待与字符串完全相同的日期。非常感谢您的帮助,在此先感谢!

4

1 回答 1

0
    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 或零时差或祖鲁时区。因此,这为您提供了带有明确偏移量的 UTC 日期和时间。

如果您真正需要的只是正确的时间点,通常会使用 an 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

您注意到日期和时间的打印与之前完全相同,包括ZUTC。不同之处在于: anOffsetDateTime可以持有任何偏移量(如果你这样做,将持有不同的偏移量XMLGregorianCalendar)。AnInstant被认为是独立于任何区域或偏移的时间点。只有它的toString方法使用 UTC 打印日期和时间,并且后缀将始终Z为 UTC。

你的代码出了什么问题?

首先,SimpleDateFormat该类不仅早已过时。它也是出了名的麻烦,尤其是在解析方面,但仍然如此。TimeZone也过时了。您将更喜欢使用java.time现代 Java 日期和时间 API,就像我在上面的代码片段中所做的那样。

我运行了你的代码并得到了2018-07-06T05:11:00.050+0000. 从 UTC 偏移零的打印方式不同,但字符串与您所说的一致。

您不能有一个java.util.Date(另一个过时的类)具有时区或偏移量。它代表一个时间点,仅此而已。

链接

于 2018-07-06T10:08:37.803 回答