我一直在工作的任务中,我需要从XMLGregorianCalendar获取日期。我已将其转换为GregorianCalendar,并尝试从it.But中获取日期。我看到存储在XMLGregorianCalendar中的原始日期和从toGregorianCalendar中获取的日期之间的差异,我希望日期采用UTC格式,并且源时区也在UTC.Please中查找代码片段以供参考。
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获取日期,而不使用任何时间difference.Below是存储在XMLGregorianCalendar中的示例源日期
2018-07-06T05:11:00.050Z我期待着与字符串完全相同的日期,在我用SimpleDateFormat.Your帮助格式化它之后,非常感谢,提前谢谢!
发布于 2018-07-06 18:08:38
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 ZZ表示协调世界时或零偏移或祖鲁时区。因此,这将为您提供具有显式偏移量的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。不同之处在于:OffsetDateTime可以容纳任何偏移量(如果XMLGregorianCalendar持有不同的偏移量,它将持有不同的偏移量)。Instant被认为是独立于任何区域或偏移的时间点。只有它的toString方法使用UTC来打印日期和时间,并且UTC的后缀始终是Z。
你的代码出了什么问题?
首先,SimpleDateFormat类不仅已经过时很久了。它也是出了名的麻烦,特别是当涉及到解析时,但仍然如此。TimeZone也过时了。您将更喜欢使用java.time,即现代Java date and time API,就像我在上面的代码片段中所做的那样。
我运行了你的代码并得到了2018-07-06T05:11:00.050+0000。从UTC到零的偏移量以不同的方式打印,但字符串与您所说的内容一致。
不能有带有时区或偏移量的java.util.Date (另一个过时的类)。它代表一个时间点,仅此而已。
链接
java.time.https://stackoverflow.com/questions/51204642
复制相似问题