0

日期 2018 年 9 月 27 日星期四 00:00:00 CEST

变成

2018-09-26T22:00:00.000Z

在 XMLGregorianCalendar 中转换时

通过这种方法:

 public static XMLGregorianCalendar dateToXMLGregorianCalendar(Date date) throws DatatypeConfigurationException{
    GregorianCalendar cal = new GregorianCalendar();
    cal.setTime(date);
    return DatatypeFactory.newInstance().newXMLGregorianCalendar(cal);
}

如何避免此日期更改?

肿瘤坏死因子

4

2 回答 2

1

那是相同的日期和时间。

您的第一个日期在 CEST 时区,相当于 UTC+2 您的第二个时间戳在 Z 时区呈现,相当于 UTC+0

因此,两者都意味着相同的时间点,但呈现方式不同。

GregorianCalendar 有一种更改日历时区的方法,如果您想在 CEST 日期和时间中输出,那么我建议您将日历时区更改为此。有关 API 参考,请参阅GregorianCalendar.setTimeZone

这也取决于您如何从该日历中检索日期。如果您只是打算使用.getTime()返回普通 Java Date 对象的方法,那么您可以通过DateTimeFormatter发送它以在您想要的任何时区输出日期。

如果您只关心日期的实际“日期”部分,并且不想使其适应各种时区,请查看LocalDate

于 2018-09-27T15:50:01.447 回答
1

这个问题有很多可能的答案,具体取决于您的情况和具体要求。我假设您要求 an 是XMLGregorianCalendar因为您将在 XML 文档中使用它,其中它的toXMLFormat方法会产生您需要的语法。

试试 LocalDate 是否有效

    LocalDate ld = LocalDate.of(2018, Month.SEPTEMBER, 27);
    System.out.println(ld);

这输出:

2018-09-27

如果您需要在 XML 文档中放入日期,而不是日期和时间以及 UTC 偏移量,那么这将是合乎逻辑的解决方案。以上是 XML 中的有效日期格式(检查底部的链接)。您的 XML 文档的接收者是否接受它我无法确定。我会知道那是不是我。

您问题中的方法接受一个Date论点。该Date课程早已过时并且存在设计问题,因此请尽可能避免使用。如果无法避免,请将其转换为LocalDate

    ZoneId zone = ZoneId.of("Europe/Rome");
    LocalDate ld = date.toInstant().atZone(zone).toLocalDate();

请使用我放置欧洲/罗马的您想要的时区,因为它在所有时区都不是相同的日期。正确的时区决定了您是在 9 月 26 日还是 27 日。

使用偏移日期时间

    ZoneId zone = ZoneId.of("Europe/Rome");
    OffsetDateTime odt = LocalDate.of(2018, Month.SEPTEMBER, 27)
                            .atStartOfDay(zone)
                            .toOffsetDateTime();
    System.out.println(odt);

2018-09-27T00:00+02:00

这几乎是您也可以从中获得的语​​法XMLGregorianCalendarXMLGregorianCalendar如果您愿意,也可以生成它)。不包括秒和毫秒。再次检查是否正常。如果不是,请将您OffsetDateTime的格式设置String为 XML 格式:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSxxx");
    String dateTimeString = odt.format(formatter);
    System.out.println(dateTimeString);

2018-09-27T00:00:00.000+02:00

这完全符合您在问题中得到的语法XMLGregorianCalendar,只有日期和时间没有更改。同样,如果您无法避免接受老式的Date,请转换:

    OffsetDateTime odt = date.toInstant().atZone(zone).toOffsetDateTime();

如果您确实需要 XMLGregorianCalendar

    ZoneId zone = ZoneId.of("Europe/Rome");
    ZonedDateTime zdt = date.toInstant().atZone(zone);
    GregorianCalendar cal = GregorianCalendar.from(zdt);
    XMLGregorianCalendar xmlgcal = DatatypeFactory.newInstance().newXMLGregorianCalendar(cal);
    System.out.println(xmlgcal);

2018-09-27T00:00:00.000+02:00

时区规范控制偏移量,从而控制产生的日期和时间。

链接

于 2018-09-28T15:14:47.550 回答