【问题标题】:Format instance of XMLGregorianCalendarXMLGregorianCalendar 的格式实例
【发布时间】:2021-08-10 04:14:25
【问题描述】:

我有一个XMLGregorianCalendar 的实例,日期格式为

yyyy-MM-dd'T'HH:mm:ss  

我需要一个XMLGregorianCalendar 的实例

yyyy-MM-dd':'HH:mm:ss 

日期格式。有可能吗?

我需要使用 JAXB 在 XML 中设置此日期,其中架构要求字段为 XMLGregorianCalendar

【问题讨论】:

标签: java jaxb datetime-format xmlgregoriancalendar


【解决方案1】:

XMLGregorianCalendar 的对象转换为ZonedDateTime 的对象,您可以使用DateTimeFormatter 将其格式化为所需的格式。

演示:

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;

public class Main {
    public static void main(String[] args) throws DatatypeConfigurationException {
        String givenDateTimeString = "2020-11-08T13:05:46";
        XMLGregorianCalendar xmlGregorianCalendar = DatatypeFactory.newInstance()
                .newXMLGregorianCalendar(givenDateTimeString);
        System.out.println(xmlGregorianCalendar);

        ZonedDateTime zdt = xmlGregorianCalendar.toGregorianCalendar().toZonedDateTime();

        String formatted = DateTimeFormatter.ofPattern("uuuu-MM-dd':'HH:mm:ss", Locale.ENGLISH).format(zdt);

        System.out.println(formatted);
    }
}

输出:

2020-11-08T13:05:46
2020-11-08:13:05:46

现在,您可以在 XML 中使用字符串 formatted

注意:日期时间对象应该存储有关日期、时间、时区等的信息,而不是有关格式的信息。您可以使用日期时间格式化 API 使用您选择的模式将日期时间对象格式化为 String

  • 现代日期时间类型的日期时间格式类型(例如java.time.format.DateTimeFormatterjava.time.format.DateTimeFormatterBuilder 等)在包中,java.time.format
  • 旧日期时间类型的日期时间格式类型(例如java.text.SimpleDateFormatjava.text.DateFormat 等)在包中,java.text

【讨论】:

  • 当它是一个字符串时,我可以格式化日期。问题是由于 jaxb 绑定和 xml 模式约束,我必须使用 XMLGregorianCalendar。似乎以所需格式打印日期的唯一方法是更改​​ xml 架构,因此它接受字符串。
【解决方案2】:

不,这是不可能的。 XMLGregorianCalendar 的重点是以 XML 要求的格式提供日期和时间,而您所询问的格式在 XML 中是不允许的。所以你的要求是故意阻止的。

如果您的要求是XMLGregorianCalendar,那么您将不得不接受从其toStringtoXMLFormat 方法打印的格式(两者返回相同的字符串)。我也不明白为什么你不应该对此感到高兴。此格式符合 XML 规范。

PS 虽然toString()toXMLFormat() 以XML 格式返回字符串,但我认为说XMLGregorianCalendar 具有这种格式是错误的。它的内部表示是完全不同的(我们不应该关心)。我认为更正确的说法是XMLGregorianCalndar 不能有格式

链接: An answer of mine 更彻底地解释了为什么你不能有格式的日期时间对象。我以Date 为例,但我写的内容对XMLGregorianCalendar 也完全有效,我在最后提到了XMLGregorianCalendar

【讨论】:

    猜你喜欢
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 2014-10-28
    • 2012-03-03
    • 1970-01-01
    • 2016-03-11
    • 2012-12-13
    相关资源
    最近更新 更多