web-dev-qa-db-fra.com

Spécifiez le format de date dans XMLGregorianCalendar

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?

18
Deepika

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);
23

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.

15
Deepika

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.

8
adimoldovan

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);
1
James

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.

1
Ole V.V.