【发布时间】:2011-12-31 06:54:36
【问题描述】:
我有 2 节课。首先包含日历字段和整数字段(tz 偏移)。第二个包含 XmlGregorianCalendar 字段。我想比较第一堂课和第二堂课的日期。
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()) + "]");
}
我在这些课程中设置了相同的日期(11 月 19 日上午 9:00 GMT+1)。
根据系统 TZ 显示不同的结果(在 GMT TZ 中):
Debian Lenny,TZ 是 CET:
Second [Nov 19, 2011 7:00:00 AM] - wrong!
First [Nov 19, 2011 8:00:00 AM] -right!
Win7,TZ 为 GMT+3:
Second [Nov 19, 2011 8:30:00 AM] - wrong!
First [Nov 19, 2011 8:00:00 AM] -right!
我做错了什么?
谢谢。
更新
第一类和第二类:
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 是来自 Apache commons-lang lib 的 org.apache.commons.lang.SerializationUtils。
【问题讨论】:
-
你能简化一下那个测试用例吗?取出 firstClass 和 secondClass 以及 SerializationUtils.clone
标签: java calendar timezone timezone-offset