首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java格式: String to XMLGregorianCalendar

Java格式: String to XMLGregorianCalendar
EN

Stack Overflow用户
提问于 2021-05-27 12:36:42
回答 2查看 1.8K关注 0票数 2

我有一个字符串日期,我要转换为一个XMLGregorianCalendar。下面的代码在没有错误的情况下转换它。但是,我将日期传递给系统时,会得到下面报告的错误。

以下XMLGregorianCalendar工作:

以下XMLGregorianCalendar无法工作(下面的代码将其转换为此):

问题

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

代码语言:javascript
运行
复制
 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“对模式'(((((01-9)|(10-2))-((01-9)|(1\d)|(20-9)))|((((013578)|(102))-31)|(((01,3-9)|(10-2))-30)))|(((19|20)((02468)|(无效13579))-02-29))|((200-9)|(190-9))-((((01-9)|(10-2))-((01-9)|(1\d)|(20-8)))|((((013578)|(102))-31)|(((01,3-9)|(10-2))-(29|30)))))T(0-1|2)(:(0-5)){1,2}‘类型'dateTime’‘. its属性3:元素'DepartureDateTime’的属性'FlightSegment‘的值'2021-06-30T06:30:00.000+02:00’就其类型而言无效,“日期时间”http://www.elleipsis.com/booking/exception/35a8ac87-6743-4719-9504-a8a17a1a0471

EN

回答 2

Stack Overflow用户

发布于 2021-05-27 15:34:43

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

黑客

黑客只需将T编辑成XMLGregorianCalendar希望存在的字符串,然后直接解析修改过的字符串。我们既不需要java.time,也不需要Date,不需要SimpleDateFormat

代码语言:javascript
运行
复制
    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再次解析:

代码语言:javascript
运行
复制
    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转换为XMLGregorianCalendar

代码语言:javascript
运行
复制
    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);

产出仍然保持不变。

通过GregorianCalendar转换

我相信这是正式的转换:转换为ZonedDateTimeGregorianCalendar,最后转换到XMLGregorianCalendar。我们需要将不需要的字段设置为FIELD_UNDEFINED,就像在您自己的答案中一样。

代码语言:javascript
运行
复制
    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);

链接

Oracle教程:日期时间解释了如何使用java.time。

票数 1
EN

Stack Overflow用户

发布于 2021-05-27 13:21:21

这为我修复了它:(使用DatatypeConstants.FIELD_UNDEFINED)

代码语言:javascript
运行
复制
           GregorianCalendar c = new GregorianCalendar();
            c.setTime(dateCommence);
            XMLGregorianCalendar commence = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
            commence.setTimezone(DatatypeConstants.FIELD_UNDEFINED);
            commence.setMillisecond(DatatypeConstants.FIELD_UNDEFINED);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67722255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档