日期 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);
}
如何避免此日期更改?
嘟嘟
这是相同的日期和时间。
您的第一个日期是 CEST 时区,相当于 UTC+2 您的第二个时间戳以 Z 时区呈现,相当于 UTC+0
因此,两者都意味着相同的时间点,但呈现方式不同。
GregorianCalendar有一种更改日历时区的方法,如果您想以CEST日期和时间输出,那么我建议您更改日历时区。有关 API 参考,请参阅 GregorianCalendar.setTimeZone。
这也取决于您如何从该日历中检索日期。如果您只是打算使用返回纯 Java Date 对象的.getTime()
方法,那么您可以通过 DateTimeFormatter 发送此方法,以所需的任何时区输出日期。
如果您只关心日期的实际"日期"部分,并且不想使其适应不同的时区,请查看 LocalDate。
这是一个根据您的情况和确切要求有许多可能答案的问题。我假设您要求XMLGregorianCalendar
,因为您将在 XML 文档中使用它,其中其toXMLFormat
方法生成所需的语法。
尝试本地日期是否有效
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
这几乎是你从XMLGregorianCalendar
那里得到的语法(如果你愿意,XMLGregorianCalendar
也可以生成它(。不包括秒和毫秒。再次检查是否正常。如果不是,请将OffsetDateTime
格式设置为XML的String
:
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
时区的规范控制偏移量,从而也控制产生的日期和时间。
链接
- XSD 日期和时间数据类型
- XML 架构第 2 部分:数据类型第二版:章节日期