Bonne façon de convertir XMLGregorianCalendar à GregorianCalendar
J'ai 2 classes. La première contient le Calendrier de champ et champ de type Entier (tz offset). Deuxième contient XmlGregorianCalendar champ. Je veux comparer la date de sapins de classe à la date de la deuxième.
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()) + "]");
}
J'ai créé l'égalité des dates (Novembre 19, 9:00 AM GMT+1) dans les classes.
Selon le système TZ il montre des résultats différents (GMT TZ):
Debian Lenny, TZ est CET:
Second [Nov 19, 2011 7:00:00 AM] - wrong!
First [Nov 19, 2011 8:00:00 AM] -right!
Win7, TZ est de GMT+3:
Second [Nov 19, 2011 8:30:00 AM] - wrong!
First [Nov 19, 2011 8:00:00 AM] -right!
Ce que je fais mal?
Grâce.
Mise à JOUR
1re et 2e classes:
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 est un org.apache.commons.lang.SerializationUtils de Apache commons-lang lib.
pouvez-vous simplifier que les cas de test un peu? Prendre firstClass et secondClass et SerializationUtils.clone
voir mise à jour
voir mise à jour
OriginalL'auteur ninja | 2011-11-17
Vous devez vous connecter pour publier un commentaire.
C'était un problème de Fuseau horaire lorsque nous appelons (Calendrier) SerializationUtils.clone(firstClass.getDepartureDatetime()). Le fuseau horaire est défini sur le serveur TZ et nous avons perdu quelques heures pendant la comparaison.
OriginalL'auteur ninja
La première question à vous poser: Que suis-je en train de faire? La conversion de GregorianCalendar et XMLGregorianCalendar est facile:
Mais qui ne semble pas être la base de votre problème. Essayez-vous de temps de la zone de conversions? À mon humble avis thes peut être fait plus facilement si vous changez la conversion à l'affichage de l'heure (car il est vraiment un problème de mise en forme), utilisez le fait que les deux GregorianCalendar et XMLGregorianCalendar porter leurs informations de fuseau horaire avec eux et de se débarrasser des deux classes d'assistance.
Ou peut-être votre problème est vraiment une question de désinfection à l'entrée. Je vois que vous avez un departureTime variable, sans doute pour des vols à partir des aéroports à travers le monde, et vous avez probablement depuis une source de données qui n'a pas explicite les informations de fuseau horaire, et au lieu de cela suppose "l'heure locale à l'aéroport". Qui pourrait expliquer le helper classes, mais dans ce cas, vous devez désinfecter votre entrée où il arrive. La détermination de "l'heure locale à l'aéroport" peut être difficile à certains moments (un pays peut décider de passer de l'heure d'été à la norme une semaine plus tard, l'année prochaine, ou l'abolition de l'heure d'été et un aéroport peut même changer les fuseaux horaires dans les états-unis, par exemple, les comtés de déplacement de orientale, centrale et arrière arrive plus souvent que vous ne le pensez). Vous devez utiliser votre ordinateur paramètres Régionaux de la base de données pour résoudre cela, et éviter d'essayer de rouler votre propre fuseau horaire de l'arithmétique.
OriginalL'auteur wallenborn