Richtige Weg, um konvertieren von XMLGregorianCalendar zu GregorianCalendar
Habe ich 2 Klassen. Zunächst enthält Kalender-Feld und Integer-Feld (tz-offset). Zweite enthält XmlGregorianCalendar Feld. Ich möchte zum vergleichen von Datum von firs-Klasse Datum aus der zweiten.
Calendar cal1 = (Calendar) SerializationUtils.clone(firstClass.getDepartureDatetime());
cal1.add(Calendar.MINUTE, -firstClass.getDepartureTzOffset());
GregorianCalendar cal2 = secondClass.getDepartureDateTime().toGregorianCalendar();
cal2.add(Calendar.MINUTE, -secondClass.getDepartureDateTime().getTimezone());
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(" - Second [" + DateFormat.getDateTimeInstance().format(cal2.getTime()) + "]");
LOGGER.debug(" - First [" + DateFormat.getDateTimeInstance().format(cal1.getTime()) + "]");
}
Habe ich gleich Termine (19. Nov, 9:00 UHR GMT+1) in die Klassen.
Je nach system TZ es zeigt verschiedene Ergebnisse (in GMT TZ):
Debian Lenny, TZ MEZ:
Second [Nov 19, 2011 7:00:00 AM] - wrong!
First [Nov 19, 2011 8:00:00 AM] -right!
Win7, TZ ist GMT+3:
Second [Nov 19, 2011 8:30:00 AM] - wrong!
First [Nov 19, 2011 8:00:00 AM] -right!
Was ich falsch mache?
Dank.
UPDATE
1. und 2. Klassen:
public class FirstClass implements Serializable {
private static final long serialVersionUID = -1150341618306402800L;
private Calendar departureDatetime;
private Integer departureTzOffset;
public Calendar getDepartureDatetime() {
return departureDatetime;
}
public void setDepartureDatetime(Calendar departureDatetime) {
this.departureDatetime = departureDatetime;
}
public Integer getDepartureTzOffset() {
return departureTzOffset;
}
public void setDepartureTzOffset(Integer departureTzOffset) {
this.departureTzOffset = departureTzOffset;
}
}
public class SecondClass implements Serializable
{
private final static long serialVersionUID = 12345L;
protected XMLGregorianCalendar departureDateTime;
public XMLGregorianCalendar getDepartureDateTime() {
return departureDateTime;
}
public void setDepartureDateTime(XMLGregorianCalendar value) {
this.departureDateTime = value;
}
}
SerializationUtils ist ein org.apache.Unterhaus.lang.SerializationUtils von Apache-commons-lang-lib.
können Sie vereinfachen, dass der Testfall ein wenig? Nehmen Sie sich einen erstklassigen und secondClass und SerializationUtils.Klon
siehe update
siehe update
InformationsquelleAutor ninja | 2011-11-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es wurde ein problem mit der Zeitzone, wenn wir rufen (Kalender) SerializationUtils.clone(firstClass.getDepartureDatetime()). Timezone wurde eingestellt, um die server TZ und wir verloren einige Stunden im Vergleich.
InformationsquelleAutor ninja
Die erste Frage die Sie sich stellen sollten: Was will ich tun? Konvertieren von GregorianCalendar und XMLGregorianCalendar ist einfach:
Aber das scheint nicht der Kern Ihres Problems. Sind Sie versuchen, führen Sie Zeit-zone Umbauten? IMHO diese kann getan werden, mehr leicht, wenn Sie verschieben die Umstellung auf die Anzeige der Zeit (da es wirklich ein Formatierungs-Problem), nutzen die Tatsache, dass beide GregorianCalendar und XMLGregorianCalendar tragen Ihre Zeitzone Informationen mit Ihnen und loszuwerden, die zwei-Helfer-Klassen.
Oder vielleicht ist Ihr problem ist wirklich ein Problem der Desinfektion der Eingabe. Ich sehe, Sie haben eine departureTime Variablen, die vermutlich für Flüge, die von Flughäfen in der ganzen Welt, und Sie wahrscheinlich bekommen Sie von einigen Daten-Quelle, die bisher keine explizite Zeit-zone Informationen, und stattdessen übernimmt "Ortszeit auf dem Flughafen". Das würde erklären, die helper-Klassen, aber in diesem Fall sollten Sie desinfizieren Sie Ihre Eingabe, wo es passiert. Die Bestimmung von "Ortszeit auf dem Flughafen" kann manchmal schwierig (ein Land kann wählen, zum Umschalten von Sommerzeit auf Normalzeit eine Woche später im nächsten Jahr, oder die Abschaffung Sommerzeit insgesamt, und ein Flughafen kann sogar der Wechsel von Zeitzonen in den USA, zum Beispiel, Landkreise Umzug von Ost-nach zentral-und wieder passiert häufiger als man denkt). Sollten Sie Ihren computer verwenden, die Locale-Datenbank zu beheben, und vermeiden Sie, die versuchen zu Rollen Ihre eigene Zeitzone der Arithmetik.
InformationsquelleAutor wallenborn