import java.util.*;
import java.text.*;public class AboutDate {
    public static void main(String[] args) {
        Date date = new Date(System.currentTimeMillis());
        Calendar c = Calendar.getInstance(), c2 = Calendar.getInstance();
        c.setTime(date);
        c2.setTime(new Date(date.getTime() - 2 * 60 * 60 * 1000));        System.out.println("hour : " + (c.get(Calendar.YEAR) - c2.get(Calendar.YEAR)));
        System.out.println("hour : " + (c.get(Calendar.MONTH) - c2.get(Calendar.MONTH)));
        System.out.println("hour : " + (c.get(Calendar.DAY_OF_YEAR) - c2.get(Calendar.DAY_OF_YEAR)));
        System.out.println("hour : " + (c.get(Calendar.HOUR_OF_DAY) - c2.get(Calendar.HOUR_OF_DAY)));
        System.out.println("hour : " + (c.get(Calendar.MINUTE) - c2.get(Calendar.MINUTE)));
    }
}在c.get(Calendar.MINUTE)里设置Calendar常数就可以满足你的需要

解决方案 »

  1.   

    Calendar xmas = new GregorianCalendar(1998, Calendar.DECEMBER, 25);
    Calendar newyears = new GregorianCalendar(1999, Calendar.JANUARY, 1);
        
        // Determine which is earlier
        boolean b = xmas.after(newyears);            // false
        b = xmas.before(newyears);                   // true
        
        
        // Get difference in milliseconds
        long diffMillis = newyears.getTimeInMillis()-xmas.getTimeInMillis();
        
        // Get difference in seconds
        long diffSecs = diffMillis/(1000);           // 604800
        
        // Get difference in minutes
        long diffMins = diffMillis/(60*1000);        // 10080
        
        // Get difference in hours
        long diffHours = diffMillis/(60*60*1000);    // 168
        
        // Get difference in days
        long diffDays = diffMillis/(24*60*60*1000);  //
      

  2.   

    我觉得楼主的需要可用两个long值的差来计算,楼主怎么说不合适昵?
      

  3.   

    bsd(小红帽菜鸟)  兄弟,他们几位的解答已经很清楚了,我觉得。你的结果不就是要求那样吗?
      
    当然,通过秒的四则运算也可以作到,直接同过 YEAR,MINUTE等Date and time functions  直接四则运算也是一样的呀。
      

  4.   

    简单地说吧
    不管是8:59:59与9:00:00
    还是8:00:00与9:00:00
    它们相差的值如果以秒计
    分别为1和3600秒
    如果以分计分别为1和60分
    如果以小时计均为1小时即计算结果类似SQL中的datediff函数
    select datediff(second,'2003/11/25 8:59:59','2003/11/25 9:00:00')
    select datediff(minute,'2003/11/25 8:59:59','2003/11/25 9:00:00')
    select datediff(hour,'2003/11/25 8:59:59','2003/11/25 9:00:00')select datediff(second,'2003/11/25 8:00:00','2003/11/25 9:00:00')
    select datediff(minute,'2003/11/25 8:00:00','2003/11/25 9:00:00')
    select datediff(hour,'2003/11/25 8:00:00','2003/11/25 9:00:00')
      

  5.   

    自己查查Calendar 类 的文档 应该可以满足你的需求 
      

  6.   

    偶已经查过很多遍了
    没有可以直接用的
    利用Calendar类倒是可以办到
    只是感觉写的代码挺傻的
    想请高手指点指点
      

  7.   

    public int dateDiff(String s,Calendar c1, Calendar c2){
      String s1=s.toUpperCase();
      if(s1.equals("DAY")){
         if((c1.get(Calendar.YEAR)==c2.get(Calendar.YEAR)) && 
            (c1.get(Calendar.DAY_OF_YEAR)==c2.get(Calendar.DAY_OF_YEAR)))
            return 0;
         else 
            return (int)
    Math.ceil((Math.abs(c1.getTimeInMillis()-c2.getTimeInMillis()))/(1000*24*3600.0));
      } else if(s1.equals("HOUR")){
            return (int)
      Math.ceil((Math.abs(c1.getTimeInMillis()-c2.getTimeInMillis()))/(1000*3600.0));
      } else if(s1.equals("MINUTE")){
         return (int)
       Math.ceil((Math.abs(c1.getTimeInMillis()-c2.getTimeInMillis()))/(1000*60.0));
      } else if(s1.equals("SECONDS")){
         return (int)
       Math.ceil((Math.abs(c1.getTimeInMillis()-c2.getTimeInMillis()))/(1000.0));
      } else
         return Integer.MIN_VALUE; //error
    }//test
    .....
    c1.set(2003,10,24,23,59,59);
    c2.set(2003,10,25,0,0,0);
    System.out.println(dateDiff("day",c1,c2));
    System.out.println(dateDiff("hour",c1,c2));
    System.out.println(dateDiff("minute",c1,c2));
    System.out.println(dateDiff("seconds",c1,c2));
      

  8.   

    谢谢wobelisk
    不过如果用ceil来取的话在某些情况下会有一些问题
    比如8:00:01与9:59:59
    按小时计希望得到的差值是1
    但用这种做法得到的结果则是2
      

  9.   

    不管是8:59:59与9:00:00
    还是8:00:00与9:00:00
    它们相差的值如果以秒计
    分别为1和3600秒
    如果以分计分别为1和60分
    如果以小时计均为1小时
    //9:00:00 - 8:59:59 = 1second= 1小时比如8:00:01与9:59:59
    按小时计希望得到的差值是1
    //9:59:59-8:00:01 = 1hour59minutes58seconds= (you also want 1小时)what do you really want?
      

  10.   

    http://www.csdn.net/develop/read_article.asp?id=20844
      

  11.   

    楼上不正确我觉得相差的年数相对较容易些,而月数、天数则相对较复杂,其中尤以天数最复杂
    知道了相差的天数,再求相差的小时数,分数,秒数甚至毫秒数都是顺理成章的了
    诸位用毫秒来取天数的做法肯定不能满足楼主的要求
    现在已经成功取得相差天数(测试中...),正在为星期数努力TO wobelisk() :
    8点和9点不是相差1小时吗?
      

  12.   

    public int dateDiff(String s,Calendar c1, Calendar c2){
      String s1=s.toUpperCase();
      if(s1.equals("DAY")){
         if(c1.get(Calendar.YEAR)==c2.get(Calendar.YEAR))
    return  c1.get(Calendar.DAY_OF_YEAR)-c2.get(Calendar.DAY_OF_YEAR);
         else 
            return (int)
    Math.ceil((Math.abs(c1.getTimeInMillis()-c2.getTimeInMillis()))/(1000*24*3600.0));
      } else if(s1.equals("HOUR")){

            return dateDiff("DAY",c1,c2)*24+c1.get(Calendar.HOUR_OF_DAY)-c2.get(Calendar.HOUR_OF_DAY);
    //return c1.get(Calendar.HOUR_OF_DAY)-c2.get(Calendar.HOUR_OF_DAY);
      } else if(s1.equals("MINUTE")){
         return dateDiff("HOUR",c1,c2)*60+c1.get(Calendar.MINUTE)-c2.get(Calendar.MINUTE);
      } else if(s1.equals("SECONDS")){
         return dateDiff("MINUTE",c1,c2)*60+c1.get(Calendar.SECOND)-c2.get(Calendar.SECOND);
      } else
         return Integer.MIN_VALUE; //error
    }
      

  13.   

    to  wobelisk() ,
    你的写法按天数计算还会有问题,所以后面涉及到它的都会有影响
    举个例子
    2003/11/25 00:00:01 跟 2003/11/26 23:59:59
    算起来结果会是两天,而期望值是1天
      

  14.   

    2003/11/25 00:00:01 跟 2003/11/26 23:59:59:my output is 
    1 day
    47 hours
    2879 minutes
    172798 seconds
      

  15.   

    to  wobelisk() ,
    试下2002/11/25 00:00:01 跟 2003/11/26 23:59:59
      

  16.   

    to  wobelisk() ,
    对不起,我给错例子了,你的代码中处理天数的这个分支
       return (int)
    Math.ceil((Math.abs(c1.getTimeInMillis()-c2.getTimeInMillis()))/(1000*24*3600.0));
    会有问题,即如果year不同
    举个例子
    2003/11/25 00:00:01 跟 2004/11/26 23:59:59
    算起来结果会比期望值多1天
      

  17.   

    我丢人啊,我不活啦。这么EASY的问题居然连贴俩贴都有虫虫。我可是三天学完JAVA,还懂.jar的啊。昨日按SQLSERVER 的 dateDiff() 测试了一下代码,修正了大大小小一堆bug。最终版本如下。当当当当,隆重推出 dateDiff()。/*
     * @(#)DateDiff.java  1.00 11/26/2003
     *
     */
    import java.util.Calendar;
    /**
      * 
      *
      * Copyright 2003 Wobelisk. All rights reserved.
      * Free Use. No response for damage caused by errors of this file.  
      * <p>
      * dateDiff() function similar to ms sqlserver. Calculate difference between two
      * Calendars. Difference can be represented by day,week,hour,minute and second.
      * 
      * <p>
      * The difference between "2003-11-22 23:59:59" and "2003-11-23 00:00:00" is
      * 1 day, or 1 week, or 1 hour, or 1 minute or 1 second
      * <p>
      * Default week difference is based on the rule that Sunday as the first day of
      * the week. In France or China where Monday is the first day of week, you
      * should set the first day of week to Monday before calculation. For Example,
      * <pre>
      * Calendar c1=Calendar.getInstance();
      * Calendar c2=Calendar.getInstance();
      * c1.set(2003,10,23,23,0,0); //Sunday 2003-11-23 23:00:00
      * c2.set(2003,10,24,1,0,0);  //Monday 2003-11-24 01:00:00
      * dateDiff("week",c1,c2);    //week difference between c1 and c2 is 0 week
      * c1.setFirstDayOfWeek(Calendar.MONDAY);
      * c2.setFirstDayOfWeek(Calendar.MONDAY);
      * dateDiff("week",c1,c2);    //week difference between c1 and c2 is 1 week
      * </pre>
      *
      * setFirstDayOfWeek() only affects week difference
      *
      * @author [email protected]
      * @version 1.00 11/26/2003
      *
      */ 
      public class DateDiff{
          /**
       * Calculate Calendar c2 - Calendar c1
       * @param s the String represents type of difference: day, week, hour, 
       * minute, second. String is case-insensitive
       * @param c1 the Calendar instance
       * @param c2 the Calendar instance
       */    public static long dateDiff(String s,Calendar c1, Calendar c2){
         String s1=s.toUpperCase();
         if(s1.equals("DAY")){
            Calendar c11=Calendar.getInstance();
            Calendar c21=Calendar.getInstance();
            c11.set(c1.get(Calendar.YEAR),c1.get(Calendar.MONTH),c1.get(Calendar.DAY_OF_MONTH),0,0,0); 
            c21.set(c2.get(Calendar.YEAR),c2.get(Calendar.MONTH),c2.get(Calendar.DAY_OF_MONTH),0,0,0); 
            return (c21.getTimeInMillis()-c11.getTimeInMillis())/(1000*24*3600);  
       } else if(s1.equals("WEEK")){
            long base=dateDiff("DAY",c1,c2);
            int dw1=c1.get(Calendar.DAY_OF_WEEK);
            int dw2=c2.get(Calendar.DAY_OF_WEEK);

            if(c1.getFirstDayOfWeek()==Calendar.MONDAY && dw1==Calendar.SUNDAY)
       dw1+=7;
            if(c2.getFirstDayOfWeek()==Calendar.MONDAY && dw2==Calendar.SUNDAY)
       dw2+=7;
    if(base>0 && dw2<dw1)
       return base/7+1;
    else if(base<0 && dw2>dw1)
      return base/7-1;
    else 
      return base/7;
        } else if(s1.equals("HOUR")){
    return dateDiff("DAY",c1,c2)*24+c2.get(Calendar.HOUR_OF_DAY)-c1.get(Calendar.HOUR_OF_DAY);
       } else if(s1.equals("MINUTE")){
    return dateDiff("HOUR",c1,c2)*60+c2.get(Calendar.MINUTE)-c1.get (Calendar.MINUTE);
      } else if(s1.equals("SECOND")){
    return dateDiff("MINUTE",c1,c2)*60+c2.get(Calendar.SECOND)-c1.get(Calendar.SECOND);
      } else
    return Long.MIN_VALUE; //error
     }
    }
      

  18.   

    请读说明。
    调用方式:
    DateDiff.dateDiff("day",c1,c2);再有bug, 自己捉。本人不再修改。可以发邮件, 上面有地址。
      

  19.   

    贴一下偶的做法,共同探讨:)  public static long dateDiff(String part, Calendar startCal, Calendar endCal) {
        long deltaMs = endCal.getTimeInMillis() - startCal.getTimeInMillis();    if ("MILLISECOND".equalsIgnoreCase(part)) {
          return deltaMs;
        }    int reverse = 1;
        if(startCal.after(endCal)){ //if start time is after the end time
          reverse = -1;
          deltaMs = -deltaMs;
          Calendar tmp = startCal;
          startCal = endCal;
          endCal = tmp;
        }    long res = 0;    if ("YEAR".equalsIgnoreCase(part)) {
          res = endCal.get(Calendar.YEAR) - startCal.get(Calendar.YEAR);
        } else if ("MONTH".equalsIgnoreCase(part)) {
          int year = endCal.get(Calendar.YEAR) - startCal.get(Calendar.YEAR);
          res += year * 12;
          res += endCal.get(Calendar.MONTH) - startCal.get(Calendar.MONTH);
        } else if ("WEEK".equalsIgnoreCase(part)) {
          res += deltaMs / (7 * 24 * 3600 * 1000);
          int w = startCal.get(Calendar.DAY_OF_WEEK);
          int tmp = (int)(deltaMs % (7*24*3600*1000));
          startCal.add(Calendar.MILLISECOND,tmp);
          int w2 = startCal.get(Calendar.DAY_OF_WEEK);
          if(w2<w || (w2 == w && tmp>(24*3600*1000))){
            res++;
          }
        } else{
          long base = 0;
          int type = 0;
          if ("DAY".equalsIgnoreCase(part)) {
            type = Calendar.DATE;
            base = 24 * 3600 * 1000;
          } else if ("HOUR".equalsIgnoreCase(part)) {
            type = Calendar.HOUR;
            base = 3600 * 1000;
          } else if ("MINUTE".equalsIgnoreCase(part)) {
            type = Calendar.MINUTE;
            base = 60 * 1000;
          } else if ("SECOND".equalsIgnoreCase(part)) {
            type = Calendar.SECOND;
            base = 1000;
          }else{
            return Long.MIN_VALUE;
          }
          int cur = startCal.get(type);
          res = deltaMs / base;
          int tmp = (int)(deltaMs % base);
          startCal.add(Calendar.MILLISECOND,tmp);
          if(startCal.get(type)!=cur){
            res++;
          }
        }    return res*reverse;
      }