这个问题有很多可能的答案,具体取决于您的情况和具体要求。我假设您要求 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
这几乎是您也可以从中获得的语法XMLGregorianCalendar
(XMLGregorianCalendar
如果您愿意,也可以生成它)。不包括秒和毫秒。再次检查是否正常。如果不是,请将您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
时区规范控制偏移量,从而控制产生的日期和时间。
链接