ret*_*dos 2 java date xmlgregoriancalendar
我有一个看起来像这样的日期字符串。
2017-12-06T17:39:00Z
我想要做的是将此字符串转换为 XMLGregorianCalendar 但使用相同的格式。
我现在做的是:
String choosenDate = 2017-12-06T17:39:00Z;
GregorianCalendar c = new GregorianCalendar();
DateTimeFormatter timeFormatter = DateTimeFormatter.ISO_DATE_TIME;
TemporalAccessor accessor = timeFormatter.parse(dateChoisie);
Date date = Date.from(Instant.from(accessor));
c.setTime(date);
System.err.println("choosenDate: " + dateChoisie);
System.err.println("date : " + date);
XMLGregorianCalendar dateXMLGreg = null;
try
{
dateXMLGreg = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
System.err.println("dateXMLGreg: " + dateXMLGreg);
}
catch (DatatypeConfigurationException e)
{
messages.addMessage(new MessageBuilder().error().code("webservice.failure").build());
}
Run Code Online (Sandbox Code Playgroud)
这给了我以下输出:
10:47:45,957 错误 [stderr](默认任务 47)选择日期:2017-12-06T17:39:03Z
10:47:45,957 错误 [stderr](默认任务 47)日期:2017 年 12 月 6 日星期三 18:39:03 CET
10:47:45,958 错误 [stderr](默认任务 47) dateXMLGreg:2017-12-06T18:39:03.000+01:00
那么我该怎么做才能让我的 XMLGregorianCalendar dateXMLGreg 看起来像:
2017-12-06T17:39:03Z
这比你想象的要容易。
String isoDateTime = "2017-12-06T17:39:00Z";
XMLGregorianCalendar dateXMLGreg = DatatypeFactory.newInstance()
.newXMLGregorianCalendar(isoDateTime);
System.out.println(dateXMLGreg);
Run Code Online (Sandbox Code Playgroud)
这打印
2017-12-06T17:39:00Z
Run Code Online (Sandbox Code Playgroud)
newXMLGregorianCalendar有一个重载版本,它接受一个字符串——你的字符串——作为参数。我相信您会像在您的问题中一样添加 try/catch。
编辑:您XMLGregorianCalendar将其毫秒设置为DatatypeConstants.FIELD_UNDEFINED. 这样做是为了避免将毫秒作为结果的一部分打印出来toString()(在打印 时隐式调用XMLGregorianCalendar)。
另一个编辑:正如 Basil Bourque 在评论中正确地说的那样,根据您的需要XMLGregorianCalendar,您可以使用java.time现代 Java 日期和时间 API 中的类,甚至可以从中受益。例如:
Instant dateInst = Instant.parse(isoDateTime);
System.out.println(dateInst);
Run Code Online (Sandbox Code Playgroud)
这给出了与上面完全相同的输出,2017-12-06T17:39:00Z。该Instant如果偏移始终是阶级只会工作Z,它有可能是因为这是你的要求有回。java.time包括 (1) API的潜在优势通常更适合与 (2) 一起使用,以防您需要一些进一步的日期时间操作,现代 API 提供了很多。如果偏移量可能会有所不同,您可以尝试使用OffsetDateTime,但这是一个更长的故事,我将留给其他一些问题。