在 java 中格式化 XMLGregorianCalendar
Format XMLGregorianCalendar in java
我有一个日期字符串,看起来就像这样。
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());
}
这给了我以下输出:
10:47:45,957 ERROR [stderr] (default task-47) choosenDate:
2017-12-06T17:39:03Z
10:47:45,957 ERROR [stderr] (default task-47) date : Wed Dec 06
18:39:03 CET 2017
10:47:45,958 ERROR [stderr] (default task-47) dateXMLGreg:
2017-12-06T18:39:03.000+01:00
那么我该怎么做才能让我的 XMLGregorianCalendar dateXMLGreg 看起来像:
2017-12-06T17:39:03Z
像这样。
private XMLGregorianCalendar change(String dateStr) {
XMLGregorianCalendar xmlDate = null;
try {
DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
Date date = format.parse(dateStr);
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(date);
xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar);
System.out.println(xmlDate.toString());
} catch (Exception e) {
e.printStackTrace();
}
return xmlDate;
}
这比你想象的要容易。
String isoDateTime = "2017-12-06T17:39:00Z";
XMLGregorianCalendar dateXMLGreg = DatatypeFactory.newInstance()
.newXMLGregorianCalendar(isoDateTime);
System.out.println(dateXMLGreg);
这会打印
2017-12-06T17:39:00Z
newXMLGregorianCalendar
有一个重载版本,它接受一个字符串——你的 字符串——作为参数。我相信你会按照你的问题添加 try/catch。
编辑:您的 XMLGregorianCalendar
将其毫秒设置为 DatatypeConstants.FIELD_UNDEFINED
。这样做是为了避免将毫秒打印为 toString()
结果的一部分(打印 XMLGregorianCalendar
时会隐式调用)。
再编辑:正如 Basil Bourque 在 中正确所说的那样,根据您需要 XMLGregorianCalendar
的目的,您可以使用甚至受益而不是使用 java.time
中的 class,现代 Java 日期和时间 API。例如:
Instant dateInst = Instant.parse(isoDateTime);
System.out.println(dateInst);
这给出了与上面完全相同的输出,2017-12-06T17:39:00Z
。 Instant
class 仅在偏移量始终为 Z
时才有效,这可能是因为这是您要求返回的内容。 java.time
的潜在优势包括 (1) API 通常更易于使用 (2) 如果您需要进一步的日期时间操作,现代的 API 提供了丰富的资源他们中的。如果偏移量可能不同,您可以尝试使用 OffsetDateTime
,但这是一个较长的故事,我将留给其他问题。
我有一个日期字符串,看起来就像这样。
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());
}
这给了我以下输出:
10:47:45,957 ERROR [stderr] (default task-47) choosenDate: 2017-12-06T17:39:03Z
10:47:45,957 ERROR [stderr] (default task-47) date : Wed Dec 06 18:39:03 CET 2017
10:47:45,958 ERROR [stderr] (default task-47) dateXMLGreg: 2017-12-06T18:39:03.000+01:00
那么我该怎么做才能让我的 XMLGregorianCalendar dateXMLGreg 看起来像:
2017-12-06T17:39:03Z
像这样。
private XMLGregorianCalendar change(String dateStr) {
XMLGregorianCalendar xmlDate = null;
try {
DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
Date date = format.parse(dateStr);
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(date);
xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar);
System.out.println(xmlDate.toString());
} catch (Exception e) {
e.printStackTrace();
}
return xmlDate;
}
这比你想象的要容易。
String isoDateTime = "2017-12-06T17:39:00Z";
XMLGregorianCalendar dateXMLGreg = DatatypeFactory.newInstance()
.newXMLGregorianCalendar(isoDateTime);
System.out.println(dateXMLGreg);
这会打印
2017-12-06T17:39:00Z
newXMLGregorianCalendar
有一个重载版本,它接受一个字符串——你的 字符串——作为参数。我相信你会按照你的问题添加 try/catch。
编辑:您的 XMLGregorianCalendar
将其毫秒设置为 DatatypeConstants.FIELD_UNDEFINED
。这样做是为了避免将毫秒打印为 toString()
结果的一部分(打印 XMLGregorianCalendar
时会隐式调用)。
再编辑:正如 Basil Bourque 在 XMLGregorianCalendar
的目的,您可以使用甚至受益而不是使用 java.time
中的 class,现代 Java 日期和时间 API。例如:
Instant dateInst = Instant.parse(isoDateTime);
System.out.println(dateInst);
这给出了与上面完全相同的输出,2017-12-06T17:39:00Z
。 Instant
class 仅在偏移量始终为 Z
时才有效,这可能是因为这是您要求返回的内容。 java.time
的潜在优势包括 (1) API 通常更易于使用 (2) 如果您需要进一步的日期时间操作,现代的 API 提供了丰富的资源他们中的。如果偏移量可能不同,您可以尝试使用 OffsetDateTime
,但这是一个较长的故事,我将留给其他问题。