Java.util.Date de création de XMLGregorianCalendar

N'y a-t-il pas un moyen pratique d'obtenir à partir d'un java.util.Date to a XMLGregorianCalendar?

543
demandé sur Ole V.V. 2009-05-07 21:05:03

8 réponses

GregorianCalendar c = new GregorianCalendar();
c.setTime(yourDate);
XMLGregorianCalendar date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
976
répondu Ben Noland 2009-05-07 17:22:15

pour ceux qui pourraient finir ici à la recherche de la conversion opposée (de XMLGregorianCalendar à Date ):

XMLGregorianCalendar xcal = <assume this is initialized>;
java.util.Date dt = xcal.toGregorianCalendar().getTime();
200
répondu Nuno Furtado 2014-09-11 17:39:22

Voici une méthode pour convertir D'un GregorianCalendar en XMLGregorianCalendar; je laisse la partie de convertir à partir d'un java.util.Date de 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
répondu sasuke 2009-05-07 17:26:07

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 les accepté de répondre .

21
répondu Chris Knight 2017-05-23 12:18:28

j'ai juste pensé ajouter ma solution ci-dessous, puisque les réponses ci-dessus ne répondaient pas à mes besoins exacts. Mon schéma Xml exigeait des éléments de Date et D'heure distincts, et non un seul champ de date et d'heure. Le constructeur standard XMLGregorianCalendar utilisé ci-dessus générera un champ DateTime

notez qu'il y a quelques gothca, comme devoir en ajouter un au mois (puisque java compte des 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
répondu khylo 2014-07-23 09:27:55

j'espère que mon encodage ici est correct; D Pour le rendre plus rapide, il suffit d'utiliser l'appel ugly getInstance() 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
répondu Daniel K. 2015-08-04 15:02:37

en supposant que vous décodiez ou encodiez 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 faire les choses répétitives pendant que vous pouvez passer le temps sur l'écriture de code impressionnant qui délivre la valeur.

exemple pour un jodatime DateTime : (faire cela avec java.util.Date de travail - mais avec certaines limitations. Je préfère jodatime et c'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);
    }
}

voir ici: comment remplacer XmlGregorianCalendar par Date?

si vous êtes heureux de simplement faire une carte à un instant basé sur le fuseau horaire+horodatage, et le fuseau horaire original n'est pas vraiment pertinent, alors java.util.Date est probablement très bien aussi.

4
répondu KarlP 2017-05-23 11:55:11

vérifiez 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
répondu Akash 2017-03-24 11:38:14