Ein bug in Java XMLGregorianCalendar Umwandlung in ein Java-util.Datum?
Schreibe ich ein Datum/Uhrzeit-Wert in eine XML-Datei durch das Lesen eines Datums aus dem RAP-basierte Benutzeroberfläche als Java-Date-Objekt, und übergeben Sie es als eine XMLGregorianCalendar
Objekt zu der eigentlichen Datei, code zu schreiben. Die entsprechenden Klassen werden automatisch generiert und ich habe keine Kontrolle über Sie. Das Datum habe ich eingetragen war:
03-03-1933:03:03:03.
Es wurde umgewandelt, um die folgende Zeichenfolge, wenn in die Datei geschrieben:
1933-03-03T03:03:03.161+05:53
Nun, wenn ich lese das Datum zurück, um es in die Benutzeroberfläche zum Bearbeiten, es erschienen dort:
03-03-1933:03:03:23
Beachten Sie die zusätzlichen 20 Sekunden Hinzugefügt, um den tatsächlichen Wert für Sekunden.
Warum ist das passiert? Ist es einige Fehler in der API? Jede Hilfe wird sehr geschätzt!
Relevante code:
1) Umwandlung zu XMLGregorianCalendar
aus Date
:
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTimeInMillis(date.getTime());
XMLGregorianCalendar date2;
date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar);
//pass 'date2' to file writing code
2) Umstellung auf Date
aus 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) );
- Es ist etwas seltsam gehen auf in der zweiten Zeile von Schritt 1: konvertieren Sie Ihre
Date
zu einemGegorianCalendar
erscheint, um ihm eine sehr seltsame Zeit-zone:+05:53
. Seltsam ist auch, dass es einen offset von 161 Millisekunden. Könnten Sie code zeigt, wie Sie erstelltdate
? Auf meinem Rechnerdate2
Ergebnisse in1933-03-03T03:03:03.000+01:00
(was ist richtig für mein Amsterdam time zone). - Hi, danke für die Antwort. Ich verwende zwei SWT-DateTime-Objekte. Ein um das Datum zu erhalten und die anderen bekommen die Zeit. Hier ist der relevante code: int Tag = dateCtrl.getDay(); int Monat = dateCtrl.getMonth(); int Jahr = dateCtrl.getYear(); int hrs = timeCtrl.getHours(); int Minuten = timeCtrl.getMinutes(); int Sekunden = timeCtrl.getSeconds(); Calendar Calendar = Calendar.getInstance(); calendar.set(Jahr, Monat, Tag, Stunden, Minuten, Sekunden); Date Date = calendar.getTime();
- Kann das sein, in Bezug auf Indien die Zeitzone ist UTC+05:30, aber
XMLGregorianCalendar::getTimezone()
zurückint
(für die Anzahl der Stunden von der UTC-offset)? Dies scheint eine Schwäche geben. Auch von Interesse wäre, Nepal (UTC+05:45) und Afghanistan (UTC+04:30).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vor etwa 1968 gab es alle möglichen seltsamen offsets, besonders in weniger entwickelten teilen der Welt. Sie nicht sagen, welche locale Sie verwenden, aber wenn es in Indien, gab es mal etwas namens Howra Meine Zeit, hatte das offset. Ich weiß nicht, ob es war in Effekt im Jahre 1933 jedoch. Sie werden wahrscheinlich haben zu download die tz-Datenbank für Ihr Gebietsschema und überprüfen Sie die Konfiguration für das Datum.
EDIT: um Zu überprüfen, was genau passiert ist, versuchen Sie:
Dies wird Ihnen sagen, was das system glaubt, die aktuelle Zeitzone und die Zeitzone offset in der Wirkung auf die problematische Datum im Jahr 1933. Wenn ich diese in mein system bekomme ich:
JEDOCH wenn ich eine Zeile:
Habe ich dann bekommen: