Java日期格式:字符串到XMLGregorianCalendar

Java日期格式:字符串到XMLGregorianCalendar,java,date,xmlgregoriancalendar,Java,Date,Xmlgregoriancalendar,我有一个字符串日期要转换为xmlgorianicalendar。下面的代码对其进行转换,没有错误。但是,我将日期传递给的系统会收到下面报告的错误 以下XMLGregorianCalendar有效: 以下XMLGregorianCalendar不起作用(下面的代码将其转换为此): 问题 如何将字符串转换为所需格式 public static void main(String []args){ try { String commenceTOString = "

我有一个字符串日期要转换为
xmlgorianicalendar
。下面的代码对其进行转换,没有错误。但是,我将日期传递给的系统会收到下面报告的错误

以下
XMLGregorianCalendar
有效:

以下
XMLGregorianCalendar
不起作用(下面的代码将其转换为此):

问题

如何将字符串转换为所需格式

 public static void main(String []args){
    try {
        String commenceTOString = "2021-06-30 05:00:00";
        java.util.Date dateCommence = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(commenceTOString);
        System.out.println(dateCommence);
        java.util.GregorianCalendar c = new java.util.GregorianCalendar();
        c.setTime(dateCommence);
        
        javax.xml.datatype.XMLGregorianCalendar commence = javax.xml.datatype.DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
        System.out.println(commence);

    } catch (Exception e) {
        e.printStackTrace();
    }
 }
错误

E:消息验证失败。错误:[cvc模式有效:值 “2021-06-30T06:30:00.000+02:00”对于以下内容无效: 图案 (0[1-1-1-1-9[1-1-1-1-9[1-1-1-1-1-1-1-1[1-1-9[0-0-9[0-0[1-0[1-1-1-9[1-1-1-1[1-1-1-9[1-1-1[1-1-1[1-1-1-9[1[1-1-1[1-1-1[1-1[1-1-9[1-1-1[1-1-1[1-1-1-1-1-1-1-9[1[1[1[1-1-9[1[1-9[1[1-9[1[1-9[1-9[1-9[1[1[1-1-1-9[1[1-1-1-9[1[1[1-1-9[1[1[1[1[1-9[1-9])[0[1-9]| | | | | | | |(0[13578]| | | | | | | | | | | | | | |:| | | | |:| | | | | | | | | | | | | | 对于类型“dateTime”。cvc属性。3:值 上属性“DepartureDateTime”的“2021-06-30T06:30:00.000+02:00” 元素“FlightSegment”就其类型而言无效, “日期时间”。]。 http://www.elleipsis.com/booking/exception/35a8ac87-6743-4719-9504-a8a17a1a0471

这为我修复了它:(使用
DatatypeConstants.FIELD\u UNDEFINED


有很多方法可以做到这一点。通常,我建议您在日期和时间工作中使用java.time,而且在java.time类和
XMLGregorianCalendar
之间没有直接转换的情况下也是如此

    XMLGregorianCalendar commence = DatatypeFactory.newInstance()
            .newXMLGregorianCalendar(
                    dateTime.getYear(), dateTime.getMonthValue(), dateTime.getDayOfMonth(), 
                    dateTime.getHour(), dateTime.getMinute(), dateTime.getSecond(),
                    DatatypeConstants.FIELD_UNDEFINED, DatatypeConstants.FIELD_UNDEFINED);
    System.out.println(commence);
黑客 黑客只需将
T
编辑成
XMLGregorianCalendar
希望出现的字符串,然后直接解析修改后的字符串。那么我们既不需要java.time,也不需要
Date
也不需要
SimpleDateFormat

    String commenceTOString = "2021-06-30 05:00:00";
    XMLGregorianCalendar commence = DatatypeFactory.newInstance()
            .newXMLGregorianCalendar(commenceTOString.replace(' ', 'T'));
    System.out.println(commence);
输出:

2021-06-30T05:00:00

通过字符串转换 解析为
LocalDateTime
,格式化为
XMLGregorianCalendar
知道格式的字符串,并让
DatatypeFactory
再次解析:

    DateTimeFormatter parser = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss");
    
    LocalDateTime dateTime = LocalDateTime.parse(commenceTOString, parser);
    XMLGregorianCalendar commence = DatatypeFactory.newInstance()
            .newXMLGregorianCalendar(dateTime.format(formatter));
    System.out.println(commence);
输出与以前相同

通过数字转换 虽然长了几行,但这是概念上简单的转换:将每个字段从
LocalDateTime
传输到
xmlgoriiancalendar

    XMLGregorianCalendar commence = DatatypeFactory.newInstance()
            .newXMLGregorianCalendar(
                    dateTime.getYear(), dateTime.getMonthValue(), dateTime.getDayOfMonth(), 
                    dateTime.getHour(), dateTime.getMinute(), dateTime.getSecond(),
                    DatatypeConstants.FIELD_UNDEFINED, DatatypeConstants.FIELD_UNDEFINED);
    System.out.println(commence);
输出仍然是一样的

通过Gregorianalendar转换 我认为这是正式的转换:转换为
ZoneDateTime
Gregoriacalendar
,最后转换为
XMLGregoriacalendar
。我们需要将不需要的字段设置为
field\u UNDEFINED
,就像您自己的答案一样

    ZonedDateTime dateTime = LocalDateTime.parse(commenceTOString, parser)
            .atZone(ZoneOffset.UTC);
    GregorianCalendar gc = GregorianCalendar.from(dateTime);
    XMLGregorianCalendar commence = DatatypeFactory.newInstance()
            .newXMLGregorianCalendar(gc);
    commence.setTimezone(DatatypeConstants.FIELD_UNDEFINED);
    commence.setMillisecond(DatatypeConstants.FIELD_UNDEFINED);
    System.out.println(commence);
链接
解释如何使用java.time。

我建议您不要使用
SimpleDateFormat
Date
。这些类设计得很糟糕,而且早已过时,其中前者尤其令人讨厌。改为使用
LocalDateTime
DateTimeFormatter
,两者都来自。类似:。