【问题标题】:Fetching Date from XMLGregorianCalendar从 XMLGregorianCalendar 获取日期
【发布时间】:2018-12-14 17:21:22
【问题描述】:

我一直在处理需要从 XMLGregorianCalendar 获取日期的任务。我已将其转换为 GregorianCalendar 并尝试从中获取日期。但我发现存储在 XMLGregorianCalendar 中的原始日期与从 toGregorianCalendar 获得的日期之间存在差异,我希望日期为 UTC 格式,源时区也为 UTC。请查找代码 sn-p 以供参考。

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

【问题讨论】:

  • 如果您的意思是java.util.Date,它既没有格式也没有偏移量或区域,所以它不可能是“UTC 格式”。见All about java.util.date
  • 是的 java.util.Date,有没有使用 SimpleDateFormat 或 DateFormat 的方法?或任何其他获取日期和时间的替代方法,包括时区?
  • 对于 UTC 的日期和时间,我建议使用 InstantOffsetDateTime。两个班级都在java.time, the modern Java date and time API。后者可以明确地以 UTC 表示,但如果您需要的是一个时间点,前者通常就足够了。我会看看我今天晚些时候是否有时间写一个答案。
  • @Ole V.V.非常感谢!

标签: java date xmlgregoriancalendar


【解决方案1】:
    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 日期和时间。

如果您真正需要的只是正确的时间点,通常会使用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 被认为是独立于任何区域或偏移的时间点。只有 toString 方法使用 UTC 打印日期和时间,并且 UTC 的后缀将始终为 Z

您的代码出了什么问题?

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

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

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

链接

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 2019-08-22
    • 2019-02-04
    • 1970-01-01
    • 2012-06-22
    相关资源
    最近更新 更多