从XMLGregorianCalendar获取日期

时间:2018-07-06 06:57:11

标签: java java-date 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());

我想知道是否有任何方法可以从XMLGregorianCalendar中获取带有UTC时区且没有任何时差的日期。下面是存储在XMLGregorianCalendar中的示例源日期

2018-07-06T05:11:00.050Z

使用SimpleDateFormat格式化字符串后,我希望它与字符串的日期完全相同。非常感谢您的帮助!

1 个答案:

答案 0 :(得分: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或零偏移或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

您注意到,日期和时间的打印与之前一样,包括用于UTC的Z。区别在于:OffsetDateTime可以保留任何偏移量(如果您的XMLGregorianCalendar可以保留任何偏移量)。 Instant被认为是与任何区域或偏移量无关的时间点。只有使用UTC打印日期和时间的toString方法,后缀对于UTC始终为Z

您的代码出了什么问题?

首先,SimpleDateFormat类不仅已经过时。众所周知,它也很麻烦,特别是在解析时,但仍然如此。 TimeZone也已经过时。就像我在上面的代码片段中所做的那样,您将更喜欢使用现代Java日期和时间API java.time

我运行了您的代码,得到了2018-07-06T05:11:00.050+0000。与UTC的偏移量为0的打印方式有所不同,但是字符串与您想要的内容一致。

您不能有带有时区或偏移量的java.util.Date(另一个过时的班级)。它只是一个时间点。

链接