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);
}
}
C'est un moyen court:
public DateTime convert(final XMLGregorianCalendar xmlgc) {
return new DateTime(xmlgc.toGregorianCalendar().getTime());
}
Voici comment vous pouvez avoir xs:date
correspondant à Joda-Time DateTime
étant généré dans le modèle de classe.
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>
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>
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
}
}
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);
Votre question n'est pas claire.
Si vous avez un fichier Java.util.Date, vous pouvez facilement le convertir en un DateTime Joda-Time:
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.
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();
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.