web-dev-qa-db-fra.com

Format Joda DateTime pour le type XMLGregorianCalendar

J'utilise JAXB 2.2.8-b01 impl et j'ai un schéma qui a un élément xs: date qui crée une instance XMLGregorianCalendar. J'essaie d'obtenir un format Joda-TimeDateTime timestamp, mais comme je dois disposer d'une instance XMLGregorianCalendar, je ne suis pas sûre que ce soit possible. Des idées?

Schema XSD:

<xs:element type="xs:date" name="date-archived" minOccurs="0" maxOccurs="1" nillable="false"/>

Propriété générée JAXB:

@XmlSchemaType(name = "date")
protected XMLGregorianCalendar date;

Classe de conversion XML:

//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);
    }
}
12
c12

C'est un moyen court:

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

Voici comment vous pouvez avoir xs:date correspondant à Joda-Time DateTime étant généré dans le modèle de classe.

Schéma XML

Voici un schéma XML avec deux éléments de type 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>

Liaison xs:date à Joda-Time DateTime

Un document de liaison externe peut être utilisé pour personnaliser la génération de classe. Vous trouverez ci-dessous la procédure à suivre pour générer Joda-Time DateTime pour xs:date. Le document de liaison est référencé à l'aide de l'indicateur -b vers XJC.

xjc -b binding.xml schema.xsd

Lier toutes les instances

<?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>

Lier une instance

Le fichier de liaison ci-dessous obligera l'élément foo à utiliser DateTime mais pas l'élément bar.

<?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:bindings schemaLocation="schema.xsd">
        <jxb:bindings node="//xs:element[@name='foo']">
            <jxb:property>
                <jxb:baseType>
                    <jxb:javaType 
                       name="org.joda.time.DateTime" 
                       parseMethod="com.example.MyConverter.parseDate" 
                       printMethod="com.example.MyConverter.printDate" />
                </jxb:baseType>
            </jxb:property>
        </jxb:bindings>
    </jxb:bindings>
</jxb:bindings>

com.example.MonConvertisseur

C'est là que vous mettez votre logique pour convertir une String à partir de 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
    }

}

Pour plus d'informations

9
Blaise Doughan

Ce n'est pas clair, mais si vous voulez XMLGregorianCalendar de JodaTime DateTime, c'est possible:

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

Votre question n'est pas claire.

DateTime?

Si vous avez un fichier Java.util.Date, vous pouvez facilement le convertir en un DateTime Joda-Time:

  1. Passez l'instance de Date au constructeur d'un DateTime.
  2. Passez une instance DateTimeZone au même constructeur.

Alors qu'un Java.util.Date n'a pas de fuseau horaire attribué (il représente UTC/GMT, sans décalage de fuseau horaire), un org.joda.time.DateTime connaît effectivement son propre fuseau horaire. Si vous souhaitez que votre DateTime ait le format UTC/GMT au lieu d'un fuseau horaire spécifique, utilisez la constante intégrée DateTimeZone.UTC .

Java.util.Date someDate = new Java.util.Date();
DateTime dateTime = new DateTime( someDate, DateTimeZone.UTC );

// Or, a specific time zone.
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime dateTimeParis = new DateTime( someDate, timeZone );

Décharger pour consoler…

System.out.println( "dateTime: " + dateTime );
System.out.println( "dateTimeParis: " + dateTimeParis );

Quand couru…

dateTime: 2014-01-22T22:39:03.996Z
dateTimeParis: 2014-01-22T23:39:03.996+01:00

En passant l'instance Date, c'est aussi simple que cela. Vous pouvez extraire de l'instance Date son nombre de millisecondes depuis le UnixEpoch , et transmettre ce nombre long à DateTime. Mais pas besoin, car la classe DateTime est prête à faire ce travail.

Chaîne?

Ou par «format d'horodatage» voulez-vous dire que vous voulez une chaîne formatée ISO 8601 comme ceci: 2014-01-19T12:38.301Z? Ce format de chaîne est le format par défaut pour la méthode toString d'un DateTime. 

String isoString = new DateTime( someDate, DateTimeZone.UTC ).toString();
2
Basil Bourque

Nous avons fait face à cela et après avoir passé du temps avec des formateurs, nous avons trouvé la solution la plus simple.

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

C'était une saveur de la vie.

1
Sanjay Bharwani