2010-11-26 21 views
2

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

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). –

+0

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

+0

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

Répondre

2

Avant environ 1968, il y avait toutes sortes de décalages étranges, en particulier dans les parties moins développées du monde. Vous ne dites pas quelle région vous utilisez, mais si c'est en Inde, il y avait une fois quelque chose appelé Howra Mean Time qui avait ce décalage. Je ne sais pas si c'était en vigueur en 1933 cependant. Vous devrez probablement télécharger le tz database pour vos paramètres régionaux et vérifier la configuration pour cette date.

EDIT: Pour vérifier exactement ce qui se passe, essayez:

GregorianCalendar c = new GregorianCalendar(); 
TimeZone tz = c.getTimeZone(); 
System.out.println(tz); 

int tzo = tz.getOffset(date.getTime()); 
System.out.println(
     tzo/3600000 + ":" + 
     (tzo/60000)%60 + ":" + 
     (tzo/1000)%60 + "." + 
     tzo%1000); 

Cela 1933. vous dira ce que le système pense que le fuseau horaire actuel est, et le décalage horaire en vigueur à la date problématique Quand je exécuter dans mon système que je reçois:

sun.util.calendar.ZoneInfo[id="America/Chicago",offset=-21600000,dstSavings=3600000,useDaylight=true,transitions=235,lastRule=java.util.SimpleTimeZone[id=America/Chicago,offset=-21600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]] 
-6:0:0.0 

CEPENDANT, si je change une ligne:

GregorianCalendar c = new GregorianCalendar(TimeZone.getTimeZone("IST")); 

J'obtiens alors:

sun.util.calendar.ZoneInfo[id="IST",offset=19800000,dstSavings=0,useDaylight=false,transitions=6,lastRule=null] 
5:53:20.0 
+0

Salut, merci pour votre réponse. Je suis en Inde mais j'utilise 'en_US' comme locale. – shrini1000