在java中格式化XMLGregorianCalendar

时间:2017-12-08 10:00:21

标签: java date xmlgregoriancalendar

我有一个日期字符串,看起来就像这样。

  

2017-12-06T17:39:00Z

我想做的是将此String转换为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](默认任务-47)choosenDate:   2017-12-06T17:39:03Z

     

10:47:45,957 ERROR [stderr](默认任务-47)日期:06年12月12日星期三   2017年1月18日19:39:03

     

10:47:45,958 ERROR [stderr](默认任务-47)dateXMLGreg:   2017-12-06T18:39:03.000 + 01:00

那我怎么能这样做我的XMLGregorianCalendar dateXMLGreg看起来像:

  

2017-12-06T17:39:03Z

2 个答案:

答案 0 :(得分:3)

这比你想象的容易。

    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在a comment中正确说的那样,根据您对XMLGregorianCalendar所需要的内容,您可以使用,甚至可以从使用java.time,现代Java日期和时间API。例如:

    Instant dateInst = Instant.parse(isoDateTime);
    System.out.println(dateInst);

这提供与上面完全相同的输出2017-12-06T17:39:00Z。仅当偏移始终为Instant时,Z类才会起作用,这可能是因为这是您要求的偏移量。 java.time的潜在优势包括:(1)API通常更好用(2)如果您需要进一步的日期时间操作,现代API提供了丰富的日期时间。如果偏移量可能会有所不同,您可以尝试OffsetDateTime,但这是一个较长的故事,我将留下其他问题。

答案 1 :(得分:0)

像这样。

    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;
}