我的一段代码如下:
                  String date = "2009-04-05";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
if (date==null||date.equals("")||date.equals("null")){
 date = sdf.format(new Date());
}
Date riqi = null;
try {
riqi = SimpleDateFormat.getDateInstance().parse(date);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String[]  ids  =  TimeZone.getAvailableIDs(-8*60*60*1000);
if(ids.length==0){
System.exit(0);
}
SimpleTimeZone  pdt  =  new  SimpleTimeZone(-8*60*60*1000,ids[0]);
pdt.setStartRule(Calendar.APRIL,1,Calendar.SUNDAY,2*60*60*1000);
pdt.setEndRule(Calendar.OCTOBER,-1,Calendar.SUNDAY,2*60*60*1000);
Calendar  calendar  =  new  GregorianCalendar(pdt);
calendar.setTime(riqi);
calendar.add(Calendar.DAY_OF_MONTH,-1);
String qianyitian = sdf.format(calendar.getTime());
calendar.add(Calendar.DAY_OF_MONTH,1);
calendar.add(Calendar.DAY_OF_MONTH,1);
String houyitian =  sdf.format(calendar.getTime());

System.out.println("上一天:"+qianyitian + " 下一天:"+ houyitian);
输出的结果是:上一天:2009-04-04 下一天:2009-04-05
但是在算别的日期时没出现这个问题,我试了一下,一年大约有一天会这样,如:“2008-04-06”的答案也会算错。这是为什么呢?

解决方案 »

  1.   

    换成Calendar.getInstance();正常了。
    以前的代码是我从别的地方搜的,到底为什么这样我也不知道,谁能给我个解释
      

  2.   

    呵呵只能看GregorianCalendar类和Calendar类的源代码了
      

  3.   

    呵呵只能看GregorianCalendar类和Calendar类的源代码了
      

  4.   

    可能和lazy操作有关,calendar的set操作都是lazy的,具体什么时候会更新结果javadoc里有讲