定义方法为:
    int [] getDateLength(String fromDate, String toDate)
将结果保存在一个整型数组中:{年, 月, 日}使用方法及执行结果:
    getDateLength("2007531", "20070601");    {0, 0, 1}
    getDateLength("2007531", "20070631");    {0, 1, 0}
    getDateLength("2007531", "20080531");    {1, 0, 0}
    getDateLength("2007531", "20080601");    {1, 0, 1}我知道可以用IBM的icu4j_2_8.jar中的Calendar.fieldDifference(),但是我希望只用JDK自带的类解决此问题,请各位给出一个能够保证效率的解决办法。

解决方案 »

  1.   

    先根据两个时间搞出距1900-1-1的那个表示毫秒的长整型,用util里的类。
    然后相减就是毫秒差,利用毫秒差计算对应的年月日时分秒
    计算方法就是用那个毫秒/1000就是秒…………………………可能效率方面达不到要求吧。在楼主找不到方法的情况下可以顶一下。呵呵
      

  2.   

    public class Slob
    {
    /**
     * @param args
     */
    public static void main(String[] args)
    {
    System.out.println(format(getDateLength("20070531", "20070601")));
    System.out.println(format(getDateLength("20070531", "20070630")));
    System.out.println(format(getDateLength("20070531", "20080531")));
    System.out.println(format(getDateLength("20070531", "20080601")));
    }
    static int[] getDateLength(String from, String to)
    {
    java.text.DateFormat df = new java.text.SimpleDateFormat("yyyyMMdd");
    java.util.Calendar c1 = java.util.Calendar.getInstance();
    java.util.Calendar c2 = java.util.Calendar.getInstance();
    try
    {
    c1.setTime(df.parse(from));
    c2.setTime(df.parse(to));
    } catch (java.text.ParseException e)
    {
    // XXX Auto-generated catch block
    System.err.println("日期格式不正确,应该是yyyyMMdd");
    e.printStackTrace();
    }
    int[] result = new int[3];
    result[0] = (c2.get(java.util.Calendar.YEAR) - c1.get(java.util.Calendar.YEAR)) < 0 ? 0 : c2
    .get(java.util.Calendar.YEAR)
    - c1.get(java.util.Calendar.YEAR);
    result[1] = (c2.get(java.util.Calendar.MONTH) - c1.get(java.util.Calendar.MONTH)) < 0 ? 0 : c2
    .get(java.util.Calendar.MONTH)
    - c1.get(java.util.Calendar.MONTH);
    result[2] = (c2.get(java.util.Calendar.DAY_OF_MONTH) - c1.get(java.util.Calendar.DAY_OF_MONTH)) < 0 ? 0 : c2
    .get(java.util.Calendar.DAY_OF_MONTH)
    - c1.get(java.util.Calendar.DAY_OF_MONTH);
    return result;
    }
    static String format(int[] result)
    {
    StringBuffer sb = new StringBuffer();
    sb.append("[");
    for (int i = 0; i < result.length - 1; i++)
    sb.append(result[i] + ",");
    sb.append(result[result.length - 1] + "]");
    return sb.toString();
    }
    }
      

  3.   

    imA(男的不会,会的不男) 男人中的男人,强!
      

  4.   

    所以才写这么一段代码,无聊所致。
    都是一些基本得API方法,看看API文档都能写出来!
      

  5.   

    回复人:coolhorse168(今天深蓝色) ( 二级(初级)) 信誉:100  2007-02-15 10:26:30  得分:0

    第一组结果应该为[0,0,1]这个也不算错误,这要看lz的需求是什么样的,按照你说的那么20060530和20060630既可以是[0,1,0]也可以是[0,0,30]呢
      

  6.   

    imA的方法只是简单计算两个日期相差的年数、月数和天数,并没有实际解决问题。
    例如,我输入20070528和20080302,得到的结果是{1, 2, 26},我想要的结果是{0, 9, 3}。
    过程解释:
      20070528经过0年9个月到达20080228,且2008年是闰年,二月是大月,20080228再过3天到达预定值。
      如果我输入20080528和20090302,那得到的结果就应该是{0, 9, 2}。
      

  7.   

    IBM的ICU4J:
    http://icu.sourceforge.net/
      

  8.   

    我这个应该是毫无问题的
    //----------------------------
    import java.util.Calendar;public class Y {
      public static void main(String[] args) {
        int ret[] = getDateLength("20050531", "20070101");
        System.out.println(ret[0] + ":" + ret[1] + ":" + ret[2]);
      }  static int[] getDateLength(String fromDate, String toDate) {
        Calendar c1 = getCal(fromDate);
        Calendar c2 = getCal(toDate);
        int[] p1 = { c1.get(Calendar.YEAR), c1.get(Calendar.MONTH), c1.get(Calendar.DAY_OF_MONTH) };
        int[] p2 = { c2.get(Calendar.YEAR), c2.get(Calendar.MONTH), c2.get(Calendar.DAY_OF_MONTH) };
        return new int[] { p2[0] - p1[0], p2[0] * 12 + p2[1] - p1[0] * 12 - p1[1], (int) ((c2.getTimeInMillis() - c1.getTimeInMillis()) / (24 * 3600 * 1000)) };
      }  static Calendar getCal(String date) {
        Calendar cal = Calendar.getInstance();
        cal.clear();
        cal.set(Integer.parseInt(date.substring(0, 4)), Integer.parseInt(date.substring(4, 6)) - 1, Integer.parseInt(date.substring(6, 8)));
        return cal;
      }
    }
      

  9.   

    计算年的差值和天的差值比较简单。
    关键是月的差值,可以用等价的概念把年退到月,比如2007年1月,等价于2006年13月,同理等价于0年(2007*12+1)月。
    这样y1年m1月到y2年m2月 分别等价于0年(y1*12+m1)月和0年(y2*12-m2)月
    月份之差就是:y2*12+m2-y1*12-m1
      

  10.   

    SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
            long between = 0;
            try {
                java.util.Date begin = dfs.parse("2009-07-10 10:22:21.214");
                java.util.Date end = dfs.parse("2009-07-20 11:24:49.145");
                between = (end.getTime() - begin.getTime());// 得到两者的毫秒数
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            long day = between / (24 * 60 * 60 * 1000);
            long hour = (between / (60 * 60 * 1000) - day * 24);
            long min = ((between / (60 * 1000)) - day * 24 * 60 - hour * 60);
            long s = (between / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
            long ms = (between - day * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000
                    - min * 60 * 1000 - s * 1000);
            System.out.println(day + "天" + hour + "小时" + min + "分" + s + "秒" + ms
                    + "毫秒"); 你自己改改,就能用了。。