下面是出问题的junit代码,大家帮看看,是什么原因导致多出一个小时的时间?
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;import org.junit.Test;public class testDate {
@Test
public void testDate1() throws ParseException {
//正常的
String sTime = "1991-04-06 00:00:00";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date time = sdf.parse( sTime );
Calendar cd = Calendar.getInstance();
cd.setTime(time);
cd.add(Calendar.DATE, 7);
time = cd.getTime();
System.out.println(sdf.format(time));

//这个日期增加7天后,为什么会多一个小时?这天是1991年4月第一个星期天
sTime = "1991-04-07 00:00:00";
time = sdf.parse( sTime );
cd = Calendar.getInstance();
cd.setTime(time);
cd.add(Calendar.DATE, 7);
time = cd.getTime();
System.out.println(sdf.format(time));

//正常的
sTime = "1991-04-08 00:00:00";
time = sdf.parse( sTime );
cd = Calendar.getInstance();
cd.setTime(time);
cd.add(Calendar.DATE, 7);
time = cd.getTime();
System.out.println(sdf.format(time));

//这个日期增加7天后,为什么会多一个小时?这天是1990年4月第二个星期天,但是位置和1991-4月出问题的星期一样
sTime = "1990-04-08 00:00:00";
time = sdf.parse( sTime );
cd = Calendar.getInstance();
cd.setTime(time);
cd.add(Calendar.DATE, 7);
time = cd.getTime();
System.out.println(sdf.format(time));

//正常的,这天是1992年4月第一个星期天
sTime = "1992-04-05 00:00:00";
time = sdf.parse( sTime );
cd = Calendar.getInstance();
cd.setTime(time);
cd.add(Calendar.DATE, 7);
time = cd.getTime();
System.out.println(sdf.format(time));

//我对几个年份,几个月份抽样检查过,好像就这2个年份的月份的日期出问题,不知道是什么原因。
//有了解的朋友麻烦帮解释下。
}
}

解决方案 »

  1.   

    那是一种夏时制
    我也讲不清楚
    http://zhidao.baidu.com/question/25866910.html?si=1
      

  2.   

    估计是像楼上说的,看来又要多一个地方要处理,,同样的东东NET下面就帮解决了,哎,,
    再等等,看有没有朋友可以给出解决方案。。
      

  3.   

    这个是夏令时哦,使用 Calendar.DST_OFFSET 可以获得偏移量。夏令时是通过 TimeZone 的子类 sun.util.calendar.ZoneInfo 实现的。ZoneInfo 中的数据存放于 %JRE_HOME%/lib/zi 目录中。我们机器一般采用的时区名称为 Asia/Shanghai,相对应的时区信息文件位于:%JRE_HOME%/lib/zi/Asia/Shanghai 中,这是一个二进制文件。通过 sun.util.calendar.ZoneInfoFile 的解析,可以获得需要采用夏令时的时间为:  1940-06-03 01:00:00 ~ 1940-09-30 23:00:00
      1941-03-16 01:00:00 ~ 1941-09-30 23:00:00
      1986-05-04 01:00:00 ~ 1986-09-13 23:00:00
      1987-04-12 01:00:00 ~ 1987-09-12 23:00:00
      1988-04-10 01:00:00 ~ 1988-09-10 23:00:00
      1989-04-16 01:00:00 ~ 1989-09-16 23:00:00
      1990-04-15 01:00:00 ~ 1990-09-15 23:00:00
      1991-04-14 01:00:00 ~ 1991-09-14 23:00:00前段表示那一天开始的时间,也就是说那一天的 0 点在该时区中是不存在。后段表示那一天结束的时间,这个时间计算很复杂:如果当前时间为:1986-09-13 23:00:00,增加 1 小时后为 1986-09-14 00:00:00
    如果当前时间为:1986-09-13 22:00:00,增加 2 小时后为 1986-09-13 23:00:00,因为 1986-09-13 23:00:00 是夏令时结束时间,时钟需要回拨。由于每个时区的夏令时都不一样,编程语言中的夏令时算法非常复杂。幸好中国从 1992 年开始停止使用夏令时。这里是夏令时时区数据页面:http://www.twinsun.com/tz/tz-link.htm
    这里可以找到各时区最新的夏令时数据:ftp://elsie.nci.nih.gov/pub/