J'écris une valeur date/heure dans un fichier XML en lisant la date d'une interface utilisateur basée sur RAP en tant qu'objet Java Date et en la passant comme objet XMLGregorianCalendar
au code d'écriture de fichier réel. Les classes correspondantes sont générées automatiquement et je n'ai aucun contrôle sur elles. La date que j'ai entrée était:Un bogue dans la conversion Java XMLGregorianCalendar vers un Java util.Date?
03-03-1933: 03: 03: 03.
Il se convertit à la chaîne suivante lorsqu'il est écrit dans le fichier:
1933-03-03T03: 03: 03,161 + 05: 53
Maintenant, quand je lis la remontent à afficher dans l'interface utilisateur pour modifier, il est apparu comme il:
03-03-1933: 03: 03: 23
Notez les 20 secondes supplémentaires ajoutées à la valeur réelle des secondes.
Pourquoi cela se produit-il? Est-ce un bug dans l'API? Toute aide sera très appréciée!
Code pertinent:
1) Conversion en XMLGregorianCalendar
de Date
:
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTimeInMillis(date.getTime());
XMLGregorianCalendar date2;
date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar);
// pass 'date2' to file writing code
2) Conversion en Date
de XMLGregorianCalendar
:
XMLGregorianCalendar cal = getDateFromFile(); // XML date read from file
Date date = cal.toGregorianCalendar().getTime();
// show Date object in UI, dateCtrl and timeCtrl are SWT DateTime objects
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(date);
dateCtrl.setDate(calendar.get(GregorianCalendar.YEAR),
calendar.get(GregorianCalendar.MONTH),
calendar.get(GregorianCalendar.DAY_OF_MONTH));
timeCtrl.setTime(calendar.get(GregorianCalendar.HOUR_OF_DAY),
calendar.get(GregorianCalendar.MINUTE),
calendar.get(GregorianCalendar.SECOND));
Il y a quelque chose d'étrange dans la deuxième ligne de l'étape 1: la conversion de votre 'Date' un' GegorianCalendar' semble donner une zone de temps très étrange: '+05: 53' . Étrange aussi est qu'il a un décalage de 161 millisecondes. Pourriez-vous fournir un code montrant comment vous avez créé 'date'? Sur ma machine, 'date2' se traduit par' 1933-03-03T03: 03: 03.000 + 01: 00' (ce qui est correct pour mon fuseau horaire d'Amsterdam). –
Salut, merci pour la réponse.J'utilise deux objets SWT DateTime. Un pour obtenir la date et l'autre pour avoir le temps. Voici le code approprié: int day = dateCtrl.getDay(); int month = dateCtrl.getMonth(); int année = dateCtrl.getYear(); \t \t int hrs = heureCtrl.getHours(); int mins = timeCtrl.getMinutes(); int secondes = timeCtrl.getSeconds(); \t \t Calendrier du calendrier = Calendar.getInstance(); calendar.set (année, mois, jour, heures, minutes, secondes); Date date = calendar.getTime(); – shrini1000
Cela peut-il être lié au fuseau horaire de l'Inde est UTC + 05: 30, mais 'XMLGregorianCalendar :: getTimezone()' renvoie 'int' (pour le nombre d'heures de décalage UTC)? Cela semble être une faiblesse du type. Le Népal (UTC + 05: 45) et l'Afghanistan (UTC + 04: 30) seraient également intéressants. – kevinarpe