Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java XMLGregorianCalendar类型的Joda日期时间格式_Java_Xml_Jaxb - Fatal编程技术网

Java XMLGregorianCalendar类型的Joda日期时间格式

Java XMLGregorianCalendar类型的Joda日期时间格式,java,xml,jaxb,Java,Xml,Jaxb,我使用的是JAXB 2.2.8-b01 impl,我有一个模式,其中有一个xs:date元素,它创建了一个XMLGregoriacalendar实例。我正在尝试获取时间戳格式,但由于我必须有一个XMLGregorianCalendar实例,我不确定这是否可能。有什么想法吗 模式XSD: <xs:element type="xs:date" name="date-archived" minOccurs="0" maxOccurs="1" nillable="false"/> @Xml

我使用的是JAXB 2.2.8-b01 impl,我有一个模式,其中有一个xs:date元素,它创建了一个XMLGregoriacalendar实例。我正在尝试获取时间戳格式,但由于我必须有一个XMLGregorianCalendar实例,我不确定这是否可能。有什么想法吗

模式XSD:

<xs:element type="xs:date" name="date-archived" minOccurs="0" maxOccurs="1" nillable="false"/>
@XmlSchemaType(name = "date")
protected XMLGregorianCalendar date;
//java.util.Date being passed


private XMLGregorianCalendar converToGregorianCal(Date date) {
    DatatypeFactory df = null;
    try {
        df = DatatypeFactory.newInstance();
    } catch (DatatypeConfigurationException e) {
        LOG.error("error getting DatatypeFactory instance " + e.getMessage()); 
    }
    if (date == null) {
        return null;
    } else {
        GregorianCalendar gc = new GregorianCalendar();
        gc.setTimeInMillis(date.getTime());
        return df.newXMLGregorianCalendar(gc);
    }
}
XML转换类:

<xs:element type="xs:date" name="date-archived" minOccurs="0" maxOccurs="1" nillable="false"/>
@XmlSchemaType(name = "date")
protected XMLGregorianCalendar date;
//java.util.Date being passed


private XMLGregorianCalendar converToGregorianCal(Date date) {
    DatatypeFactory df = null;
    try {
        df = DatatypeFactory.newInstance();
    } catch (DatatypeConfigurationException e) {
        LOG.error("error getting DatatypeFactory instance " + e.getMessage()); 
    }
    if (date == null) {
        return null;
    } else {
        GregorianCalendar gc = new GregorianCalendar();
        gc.setTimeInMillis(date.getTime());
        return df.newXMLGregorianCalendar(gc);
    }
}

你的问题不清楚

约会时间? 如果您有一个java.util.Date,您可以轻松地将其转换为Joda Time DateTime:

  • 将日期实例传递给DateTime的构造函数
  • 将DateTimeZone实例传递给同一构造函数
  • 虽然
    java.util.Date
    没有指定时区(它表示UTC/GMT,没有任何时区偏移),但an确实知道自己的时区。如果希望DateTime使用UTC/GMT而不是特定时区,请使用内置常量

    java.util.Date someDate=new java.util.Date();
    DateTime DateTime=新的日期时间(someDate,DateTimeZone.UTC);
    //或者,特定的时区。
    DateTimeZone timeZone=DateTimeZone.forID(“欧洲/巴黎”);
    DateTime dateTimeParis=新的日期时间(someDate,时区);
    
    转储到控制台

    System.out.println(“dateTime:+dateTime”);
    System.out.println(“dateTimeParis:+dateTimeParis”);
    
    当运行时

    dateTime:2014-01-22T22:39:03.996Z
    巴黎时间:2014-01-22T23:39:03.996+01:00
    
    传递日期实例,就这么简单。您可以从Date实例中提取它自启动以来的毫秒数,并将该
    long
    number传递给DateTime。但是没有必要,因为DateTime类愿意这样做

    一串 或者“时间戳格式”是指您想要这样的格式化字符串:
    2014-01-19T12:38.301Z
    ?该字符串格式是DateTime的
    toString
    方法的默认格式

    String isoString=new DateTime(someDate,DateTimeZone.UTC).toString();
    
    使用JodaTime时要非常小心,lib不使用java的时区表

    public class XMLCalendarToDateTime {
    
        private static DatatypeFactory df = null;
        static {
            try {
                df = DatatypeFactory.newInstance();
            } catch (DatatypeConfigurationException dce) {
                throw new IllegalStateException(
                    "Exception while obtaining DatatypeFactory instance", dce);
            }
        }  
    
        private static XMLGregorianCalendar converToGregorianCal(DateTime dateTime) {
            if (dateTime == null) {
                return null;
            } else {
                GregorianCalendar gc = new GregorianCalendar();
                gc.setTimeInMillis(dateTime.getMillis());
                return df.newXMLGregorianCalendar(gc);
            }
        }
    
        private static DateTime convertToDateTime(XMLGregorianCalendar xmlGregorianCalendar){
             if (xmlGregorianCalendar == null) {
                    return null;
                } else {
                    return new DateTime(xmlGregorianCalendar.toGregorianCalendar().getTime());
                }
        }
    
        public static void main(String[] args) {
    
            final DateTime dateTime = new DateTime(2014,1,1,1,1);
    
            System.out.println("date = " + dateTime.toString());
    
            final XMLGregorianCalendar xmlGregorianCalendar = converToGregorianCal(dateTime);
    
            System.out.println("xmlGregorianCalendar = " + xmlGregorianCalendar);
    
            final DateTime dateTimeConverted = convertToDateTime(xmlGregorianCalendar);
    
            System.out.println("dateTimeConverted = "  + dateTimeConverted);
    
        }
    }
    

    下面是如何将
    xs:date
    对应于Joda-Time
    DateTime
    生成到类模型中

    XML模式 下面是一个XML模式,其中包含两个类型为
    xs:date
    的元素:

    <?xml version="1.0" encoding="UTF-8"?>
    <schema 
        xmlns="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="http://www.example.org/schema" 
        xmlns:tns="http://www.example.org/schema" 
        elementFormDefault="qualified">
    
        <element name="root">
            <complexType>
                <sequence>
                    <element name="foo" type="date"/>
                    <element name="bar" type="date"/>
                </sequence>
            </complexType>
        </element>
    
    </schema>
    
    绑定所有实例

    <?xml version="1.0" encoding="UTF-8"?>
    <jxb:bindings version="2.1"
                  xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
                  xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <jxb:globalBindings>
            <!-- use JODA-Time DateTime for xs:date -->
            <jxb:javaType name="org.joda.time.DateTime" xmlType="xs:date"
                parseMethod="com.example.MyConverter.parseDate"
                printMethod="com.example.MyConverter.printDate"/>
        </jxb:globalBindings>        
    </jxb:bindings>
    
    com.example.MyConverter 这是将
    字符串
    转换为from
    DateTime
    的逻辑:

    import org.joda.time.DateTime;
    
    public class MyConverter {
    
        public static String printDate(DateTime value) {
            // TODO - Conversion Logic
        }
    
        public static DateTime parseDate(String value) {
           // TODO - Conversion Logic
        }
    
    }
    
    更多信息
      • 这是一条捷径:

        public DateTime convert(final XMLGregorianCalendar xmlgc) {
            return new DateTime(xmlgc.toGregorianCalendar().getTime());
        }
        

        问题不清楚,但如果您想从JodaTime
        DateTime
        获取
        XMLGregorianCalendar
        ,则可以:

        final GregorianCalendar calendar = new GregorianCalendar(dateTime.getZone().toTimeZone());
        calendar.setTimeInMillis(dateTime.getMillis());
        return DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar);
        

        我们已经面对了这一问题,在花时间与格式化程序打交道之后,我们找到了一个最简单的解决方案

        String sf = xmlGregDate.toString()
        DateTime dateTime = DateTime.parse(sf)
        

        这是一种生活情趣。

        我想真正的要求是在从我的模式生成的xml文件中使用iso支持的日期格式。没错,不使用与Java捆绑的时区数据文件。相反,它使用自己的副本。Java不经常更新它的表,而Joda Time则经常更新。此外,您可以根据需要在Joda时间内轻松完成政府机构在最后一刻偶尔做出的更改。时区数据是使用Joda time而不是捆绑的java.util.Date/Calendar类的另一个很好的理由。这些转换器方法丢弃时区信息。考虑创建带有时区的日历对象:<代码>新GRGGORICONALDEAR(DATEIMET.GETZONE)(toTimeZONE())< /代码>:这有助于链接:和<代码> XMLGRGRIGORICANLAREARIMPL/<代码>来自何处?XMLGRGGORIGANCORANDARAR XMLGRGORICORANCANDARAR = DATATYPPESTORK.NEWSTSTANCE().NEXXMLGRGGORICONALDENAR(日历);仅供参考,该项目目前正在进行中,团队建议迁移到类。看
        myXMLGregorianCalendar.toGregorianCalendar().ToZoneDateTime().toString()
        @BasilBourque True,只要您使用的是Java 8。对于旧版Java 7(或6或5),Joda Time是最好的方式。@crmk_üффП在Three Ten Backport项目中,Java.Time的大部分功能已被后移植到Java 6和7。当您最终转向Java 8或更高版本时,您只需切换
        import
        语句即可。我没有意识到这一点。这将使到Java8的转换更加顺利。