java.util.Date à XMLGregorianCalendar

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

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

Pour ceux qui pourraient finir par chercher la conversion inverse (de XMLGregorianCalendar à Date ):

 XMLGregorianCalendar xcal = ; java.util.Date dt = xcal.toGregorianCalendar().getTime(); 

Voici une méthode pour convertir un GregorianCalendar à XMLGregorianCalendar; Je vais laisser la partie de la 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 Ssortingng[] args) throws Exception { GregorianCalendar gcal = new GregorianCalendar(); XMLGregorianCalendar xgcal = DatatypeFactory.newInstance() .newXMLGregorianCalendar(gcal); System.out.println(xgcal); } } 

EDIT: Slooow 🙂

Un exemple de ligne utilisant la bibliothèque Joda-Time :

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

Nous remercions Nicolas Mommaerts de son commentaire dans la réponse acceptée .

Je pensais juste append ma solution ci-dessous, car les réponses ci-dessus ne répondaient pas exactement à mes besoins. Mon schéma XML nécessitait de séparer les éléments Date et Heure, pas un champ DateSime unique. Le constructeur XMLGregorianCalendar standard utilisé ci-dessus générera un champ DateTime

Notez qu’il y a quelques gothca, comme devoir en append 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); 

J’espère que mon encodage est correct: D Pour accélérer, il suffit d’utiliser l’appel laid de getorstance () 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 Ssortingng[] args) throws Exception { // do not forget the type cast :/ GregorianCalendar gcal = (GregorianCalendar) GregorianCalendar.getInstance(); XMLGregorianCalendar xgcal = DatatypeFactory.newInstance() .newXMLGregorianCalendar(gcal); System.out.println(xgcal); } } 

En supposant que vous décodiez ou encodiez XML et que vous utilisiez JAXB , il est alors possible de remplacer entièrement la liaison dateTime et d’utiliser autre chose que XMLGregorianCalendar pour chaque date du schéma.

De cette façon, vous pouvez demander à JAXB faire les choses répétitives pendant que vous pouvez passer du temps à écrire du code génial qui offre de la valeur.

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

       

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(Ssortingng s) { try { if (SsortingngUtils.sortingmToEmpty(s).isEmpty()) return null; LocalDateTime r = dtf.parseLocalDateTime(s); return r; } catch (Exception e) { throw new IllegalArgumentException(e); } } public static Ssortingng printDateTime(LocalDateTime d) { try { if (d == null) return null; return dtf.print(d); } catch (Exception e) { throw new IllegalArgumentException(e); } } public static LocalDate parseDate(Ssortingng s) { try { if (SsortingngUtils.sortingmToEmpty(s).isEmpty()) return null; return df.parseLocalDate(s); } catch (Exception e) { throw new IllegalArgumentException(e); } } public static Ssortingng printDate(LocalDate d) { try { if (d == null) return null; return df.print(d); } catch (Exception e) { throw new IllegalArgumentException(e); } } public static Ssortingng printTime(LocalTime d) { try { if (d == null) return null; return tf.print(d); } catch (Exception e) { throw new IllegalArgumentException(e); } } public static LocalTime parseTime(Ssortingng s) { try { if (SsortingngUtils.sortingmToEmpty(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 ne mapper que sur un instant en fonction du fuseau horaire + horodatage et que le fuseau horaire d’origine n’est pas vraiment pertinent, alors java.util.Date convient probablement également.

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