我一直在从事需要从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格式化字符串后,我希望它与字符串的日期完全相同。非常感谢您的帮助!
答案 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
(另一个过时的班级)。它只是一个时间点。
java.time
。