肯定是用Calendar类时,时间格式不一样导致的,这样写就没问题
package com.test;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class Test3 { public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date1 = "1986-05-04 00:00:00";
String date2 = "1986-05-04 00:00:00";
String date3 = "1987-04-12 00:00:00";
String date4 = "1988-04-10 00:00:00";
String date5 = "1989-04-16 00:00:00";
String date6 = "1990-04-15 00:00:00";
String date7 = "1991-04-14 00:00:00";
Date d1 = null;
Date d2 = null;
Date d3 = null;
Date d4 = null;
Date d5 = null;
Date d6 = null;
Date d7 = null;
try {
d1 = sdf.parse(date1);
d2 = sdf.parse(date2);
d3 = sdf.parse(date3);
d4 = sdf.parse(date4);
d5 = sdf.parse(date5);
d6 = sdf.parse(date6);
d7 = sdf.parse(date7);
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println(d1.getTime());
System.out.println(sdf.format(new Date(d1.getTime())));
System.out.println(d2.getTime());
System.out.println(sdf.format(new Date(d2.getTime())));
System.out.println(d3.getTime());
System.out.println(sdf.format(new Date(d3.getTime())));
System.out.println(d4.getTime());
System.out.println(sdf.format(new Date(d4.getTime())));
System.out.println(d5.getTime());
System.out.println(sdf.format(new Date(d5.getTime())));
System.out.println(d6.getTime());
System.out.println(sdf.format(new Date(d6.getTime())));
System.out.println(d7.getTime());
System.out.println(sdf.format(new Date(d7.getTime())));

}
}

解决方案 »

  1.   

    刚试了下,果然是多一小时
    而且只在00时和24时出错
    问题在这一步产生的 sdf.parse(date)
      

  2.   

    Calendar类
    子类的日历解释日期根据特定的日历系统规则。
    像其他的locale敏感类,日历提供了一个类的方法,getInstance,获得一般使用该类的默认实例。日历的getInstance方法返回一个日历的现场是基于系统设置的时间域已与当前的日期和时间初始化:
    日历现在getinstance() =日历。
      

  3.   

    出错是在 sdf.parse(date) ,还没到Calendar,在parse 时就已经将值改变了  
      

  4.   

    试了下
     String date1 = "1986-05-03 00:00:00";
     String date2 = "1986-05-04 00:00:00";
     String date3 = "1986-05-04 24:00:00";
    输出
    Sat May 03 00:00:00 CST 1986
    Sun May 04 01:00:00 CDT 1986
    Mon May 05 00:00:00 CDT 1986
    3号TMD还是正常的 ,奇怪,顶下
      

  5.   


    没办法啊,正好碰到这个问题了!
    因为我们的很多数据都是实时存的,每个小时都有,近期把数据生成文件,在文件中用long存
    生成完之后现在要做数据对比(同数据库),因为是再把long转成date对比,所以出错了
    幸亏是long转成date要不还真没发现!
      

  6.   

    今天发现这么比较,就小一个小时无奈啊!SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Calendar calendar = Calendar.getInstance();
    String date = "1986-05-03 23:00:00";try {
       calendar.setTime(sdf.parse(date));
    } catch (ParseException e) {
       e.printStackTrace();
    }

    SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Calendar calendar3 = Calendar.getInstance();
    String date3 = "1986-05-04 23:00:00";try {
       calendar3.setTime(sdf3.parse(date3));
    } catch (ParseException e) {
       e.printStackTrace();
    }
    long r = (calendar3.getTimeInMillis()-calendar.getTimeInMillis());
    System.out.println("值:"+r + "---" + (r/(60*60*1000)));