Question java.util.Date en XMLGregorianCalendar


N'y a-t-il pas un moyen pratique de passer d'un java.util.Date à un XMLGregorianCalendar?


531
2018-05-07 17:05


origine


Réponses:


GregorianCalendar c = new GregorianCalendar();
c.setTime(yourDate);
XMLGregorianCalendar date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);

957
2018-05-07 17:22



Pour ceux qui pourraient finir ici à la recherche de la conversion inverse (de XMLGregorianCalendar à Date):

XMLGregorianCalendar xcal = <assume this is initialized>;
java.util.Date dt = xcal.toGregorianCalendar().getTime();

197
2018-01-04 15:03



Voici une méthode pour convertir d'un GregorianCalendar en XMLGregorianCalendar; Je vais laisser la partie de conversion d'un java.util.Date à GregorianCalendar comme un exercice pour vous:

import java.util.GregorianCalendar;

import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;

public class DateTest {

   public static void main(final String[] args) throws Exception {
      GregorianCalendar gcal = new GregorianCalendar();
      XMLGregorianCalendar xgcal = DatatypeFactory.newInstance()
            .newXMLGregorianCalendar(gcal);
      System.out.println(xgcal);
   }

}

EDIT: Slooow :-)


29
2018-05-07 17:26



Un exemple d'une ligne utilisant Joda-Time bibliothèque:

XMLGregorianCalendar xgc = DatatypeFactory.newInstance().newXMLGregorianCalendar(new DateTime().toGregorianCalendar());

Crédit à Nicolas Mommaerts de son commentaire dans la réponse acceptée.


21
2018-02-03 14:35



Je pensais juste ajouter ma solution ci-dessous, car les réponses ci-dessus ne répondaient pas exactement à mes besoins. Mon schéma Xml nécessitait des éléments Date et Heure séparés, pas un seul champ DateTime. Le constructeur XMLGregorianCalendar standard utilisé ci-dessus va générer un champ DateTime

Notez qu'il y a quelques gothques, comme l'ajout d'un au mois (puisque java compte les mois à partir de 0).

GregorianCalendar cal = new GregorianCalendar();
cal.setTime(yourDate);
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH), 0);
XMLGregorianCalendar xmlTime = DatatypeFactory.newInstance().newXMLGregorianCalendarTime(cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND), 0);

12
2018-03-16 13:02



J'espère que mon encodage ici est juste; D Pour le rendre plus rapide, utilisez juste l'appel getInstance () grégorien de GregorianCalendar au lieu de l'appel du constructeur:

import java.util.GregorianCalendar;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;

public class DateTest {

   public static void main(final String[] args) throws Exception {
      // do not forget the type cast :/
      GregorianCalendar gcal = (GregorianCalendar) GregorianCalendar.getInstance();
      XMLGregorianCalendar xgcal = DatatypeFactory.newInstance()
            .newXMLGregorianCalendar(gcal);
      System.out.println(xgcal);
   }

}

10
2017-09-21 05:49



En supposant que vous êtes en train de décoder ou d'encoder xml et en utilisant JAXB, il est alors possible de remplacer entièrement la liaison dateTime et d'utiliser autre chose que `XMLGregorianCalendar 'pour chaque date dans le schéma.

De cette façon, vous pouvez avoir JAXB faites les choses répétitives pendant que vous pouvez passer du temps sur l'écriture de code génial qui offre de la valeur.

Exemple pour une jodatime DateTime: (Faire cela avec java.util.Date fonctionnerait aussi - mais avec certaines limitations, je préfère jodatime et il est copié de mon code, donc je sais que ça marche ...)

<jxb:globalBindings>
    <jxb:javaType name="org.joda.time.LocalDateTime" xmlType="xs:dateTime"
        parseMethod="test.util.JaxbConverter.parseDateTime"
        printMethod="se.seb.bis.test.util.JaxbConverter.printDateTime" />
    <jxb:javaType name="org.joda.time.LocalDate" xmlType="xs:date"
        parseMethod="test.util.JaxbConverter.parseDate"
        printMethod="test.util.JaxbConverter.printDate" />
    <jxb:javaType name="org.joda.time.LocalTime" xmlType="xs:time"
        parseMethod="test.util.JaxbConverter.parseTime"
        printMethod="test.util.JaxbConverter.printTime" />
    <jxb:serializable uid="2" />
</jxb:globalBindings>

Et le convertisseur:

public class JaxbConverter {
static final DateTimeFormatter dtf = ISODateTimeFormat.dateTimeNoMillis();
static final DateTimeFormatter df = ISODateTimeFormat.date();
static final DateTimeFormatter tf = ISODateTimeFormat.time();

public static LocalDateTime parseDateTime(String s) {
    try {
        if (StringUtils.trimToEmpty(s).isEmpty())
            return null;
        LocalDateTime r = dtf.parseLocalDateTime(s);
        return r;
    } catch (Exception e) {
        throw new IllegalArgumentException(e);
    }
}

public static String printDateTime(LocalDateTime d) {
    try {
        if (d == null)
            return null;
        return dtf.print(d);
    } catch (Exception e) {
        throw new IllegalArgumentException(e);
    }
}

public static LocalDate parseDate(String s) {
    try {
        if (StringUtils.trimToEmpty(s).isEmpty())
            return null;
        return df.parseLocalDate(s);
    } catch (Exception e) {
        throw new IllegalArgumentException(e);
    }
}

public static String printDate(LocalDate d) {
    try {
        if (d == null)
            return null;
        return df.print(d);
    } catch (Exception e) {
        throw new IllegalArgumentException(e);
    }
}

public static String printTime(LocalTime d) {
    try {
        if (d == null)
            return null;
        return tf.print(d);
    } catch (Exception e) {
        throw new IllegalArgumentException(e);
    }
}

public static LocalTime parseTime(String s) {
    try {
        if (StringUtils.trimToEmpty(s).isEmpty())
            return null;
        return df.parseLocalTime(s);
    } catch (Exception e) {
        throw new IllegalArgumentException(e);
    }
}

Vois ici: comment remplacer XmlGregorianCalendar par date?

Si vous êtes content de mapper à un instant en fonction du fuseau horaire + horodatage, et que le fuseau horaire d'origine n'est pas vraiment pertinent, alors java.util.Date est probablement bien aussi.


4
2018-04-22 10:00



Découvrez ce code: -

/* Create Date Object */
Date date = new Date();
XMLGregorianCalendar xmlDate = null;
GregorianCalendar gc = new GregorianCalendar();

gc.setTime(date);

try{
    xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendar(gc);
}
catch(Exception e){
    e.printStackTrace();
}

System.out.println("XMLGregorianCalendar :- " + xmlDate);

Vous pouvez voir l'exemple complet ici


0
2018-03-24 10:51