Je souhaite utiliser une date au format XMLGregorianCalendar
pour l'envoi à un service Web. Le service Web attend des informations au format yyyy-dd-mm
. J'utilise le code ci-dessous pour créer une XMLGregorianCalendar
et l'envoyer au service Web.
Date dob = null;
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
try {
XMLGregorianCalendar date2;
dob = df.parse("13/06/1983");
GregorianCalendar c = new GregorianCalendar();
c.setTimeInMillis(dob.getTime());
date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
System.out.println(date2);
}
catch(DatatypeConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch(ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Malheureusement, j'obtiens toujours la date sous la forme 1983-06-13T00:00:00.000-04:00
. Le temps est également inclus dans la sortie. Est-il possible d'obtenir uniquement la date? Pourrais-tu m'aider s'il te plaît?
vous n'avez pas besoin de spécifier un "SimpleDateFormat", c'est simple:
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(new Date());
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH), DatatypeConstants.FIELD_UNDEFINED);
Oui, j'ai compris ...
Date dob=null;
DateFormat df=new SimpleDateFormat("dd/MM/yyyy");
dob=df.parse( "13/06/1983" );
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(dob);
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH), DatatypeConstants.FIELD_UNDEFINED);
Cela lui donnera le format correct.
Beaucoup plus simple en utilisant uniquement SimpleDateFormat, sans passer tous les paramètres individuels:
String FORMATER = "yyyy-MM-dd'T'HH:mm:ss'Z'";
DateFormat format = new SimpleDateFormat(FORMATER);
Date date = new Date();
XMLGregorianCalendar gDateFormatted =
DatatypeFactory.newInstance().newXMLGregorianCalendar(format.format(date));
Exemple complet ici .
Remarque: Ceci ne fonctionne que pour supprimer les 2 derniers champs: millisecondes et fuseau horaire ou pour supprimer le composant de temps complet à l'aide du formateur yyyy-MM-dd
.
C'est un moyen facile pour n'importe quel format. Il suffit de le changer pour la chaîne de format requise
XMLGregorianCalendar gregFmt = DatatypeFactory.newInstance().newXMLGregorianCalendar(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new Date()));
System.out.println(gregFmt);
Il n’ya pas vraiment de conversion idéale, mais j’aimerais proposer quelques options.
Java.time
Tout d'abord, vous devez utiliser LocalDate
à partir de Java.time, l'API de date et heure moderne de Java, pour analyser et conserver votre date. Évitez Date
et SimpleDateFormat
car ils ont des problèmes de conception et sont également obsolètes. Ce dernier en particulier est notoirement gênant.
DateTimeFormatter originalDateFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu");
String dateString = "13/06/1983";
LocalDate date = LocalDate.parse(dateString, originalDateFormatter);
System.out.println(date);
La sortie est:
1983-06-13
Avez-vous besoin d'aller plus loin? LocalDate.toString()
produit le format sur lequel vous avez posé la question.
Format et analyse
En supposant que vous ayez besoin d'une XMLGregorianCalendar
, la première et simple option de conversion est la suivante:
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance()
.newXMLGregorianCalendar(date.toString());
System.out.println(xmlDate);
1983-06-13
Formater en une chaîne et l’analyser en retour me semble une perte de temps, mais comme je l’ai dit, c’est facile et je ne pense pas qu’il y ait des surprises quant au résultat attendu.
Pass année, mois et jour du mois individuellement
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance()
.newXMLGregorianCalendarDate(date.getYear(), date.getMonthValue(),
date.getDayOfMonth(), DatatypeConstants.FIELD_UNDEFINED);
Le résultat est le même que précédemment. Nous devons préciser que nous ne voulons pas de décalage de fuseau horaire (c’est ce que DatatypeConstants.FIELD_UNDEFINED
spécifie). Dans le cas où quelqu'un se poserait des questions, les nombres LocalDate
et XMLGregorianCalendar
mois seront identiques à ceux des êtres humains, il n'y a donc aucune addition ni soustraction 1.
Convertir à travers GregorianCalendar
Je ne vous montre cette option que parce que je la considère d’une manière ou d’une autre comme la manière officielle: convertir LocalDate
en ZonedDateTime
, puis en GregorianCalendar
et enfin en XMLGregorianCalendar
.
ZonedDateTime dateTime = date.atStartOfDay(ZoneOffset.UTC);
GregorianCalendar gregCal = GregorianCalendar.from(dateTime);
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance()
.newXMLGregorianCalendar(gregCal);
xmlDate.setTime(DatatypeConstants.FIELD_UNDEFINED, DatatypeConstants.FIELD_UNDEFINED,
DatatypeConstants.FIELD_UNDEFINED, DatatypeConstants.FIELD_UNDEFINED);
xmlDate.setTimezone(DatatypeConstants.FIELD_UNDEFINED);
J'aime la conversion elle-même, car nous n’avons ni besoin d’utiliser des chaînes ni de passer des champs individuels (avec soin de le faire dans le bon ordre). Ce que je n’aime pas, c’est que nous devons passer l’heure et le décalage de fuseau horaire, puis effacer ces champs manuellement.