【问题标题】:Format XMLGregorianCalendar in java在java中格式化XMLGregorianCalendar
【发布时间】:2018-05-22 13:16:21
【问题描述】:

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

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 错误 [stderr](默认任务 47)选择日期: 2017-12-06T17:39:03Z

10:47:45,957 错误 [stderr](默认任务 47)日期:12 月 6 日星期三 2017 年中欧时间 18:39:03

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

那么我该怎么做才能让我的 XMLGregorianCalendar dateXMLGreg 看起来像:

2017-12-06T17:39:03Z

【问题讨论】:

  • 这并不是真正不同的格式(这始终是 ISO 8601),它“只是”与 UTC 的时区偏移。不过,我知道您会希望保持不变。
  • 也许您不必为XMLGregorianCalendar 操心。查看现在内置于 Java 8 和 Java 9 中的现代 java.time 类。Instant 类代表 UTC 时间轴上的时刻,默认情况下使用字符串的标准 ISO 8601 格式。 Instant.parse( "2017-12-06T17:39:00Z" )
  • @BasilBourque,感谢您指出这一点,您启发了my answer below 的编辑。

标签: java date xmlgregoriancalendar


【解决方案1】:

这比你想象的要容易。

    String isoDateTime = "2017-12-06T17:39:00Z";
    XMLGregorianCalendar dateXMLGreg = DatatypeFactory.newInstance()
            .newXMLGregorianCalendar(isoDateTime);
    System.out.println(dateXMLGreg);

打印出来

2017-12-06T17:39:00Z

newXMLGregorianCalendar 有一个重载版本,它接受一个字符串——your 字符串——作为参数。我相信你会在你的问题中添加 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。只有当偏移量始终为Z 时,Instant 类才会起作用,这可能是因为这是您要求返回的。 java.time 的潜在优势包括 (1) API 通常更易于使用 (2) 如果您需要进一步的日期时间操作,现代 API 提供了丰富的这些操作。如果偏移量可能有所不同,您可以尝试使用OffsetDateTime,但这是一个较长的故事,我将留给其他问题。

【讨论】:

  • 非常感谢您的回答。确实,我没有考虑过在参数中直接传递我的日期字符串。谢谢!
【解决方案2】:

像这样。

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

【讨论】:

    猜你喜欢
    • 2012-03-03
    • 2016-03-11
    • 2021-08-15
    • 2012-12-13
    • 2021-08-10
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    相关资源
    最近更新 更多