本帖最后由 liuyyuns 于 2010-05-27 20:41:38 编辑

解决方案 »

  1.   

    楼主可以参考一下我在这个贴子中的回复内容:
    http://topic.csdn.net/u/20100520/19/5f33d746-0280-4727-8a30-779957a6d09d.html
      

  2.   

    确认一下你的jdk,websphere可能用的是自带的ibm的jdk
      

  3.   

    如果你们就是使用ibm的jdk的话,需要按照ibm的jdk的api来写方法。里面有些实现可能是不同的
      

  4.   

    jdk不同,websphere可能用的是自带的jdk
      

  5.   

    我又测试了一条新的数据,开始日期:20080502,结束日期:20100527  输出的结果是这样的:[10-5-27 17:39:31:921 CST] 578939a1 SystemOut     O 整年
    [10-5-27 17:39:31:921 CST] 578939a1 SystemOut     O 2009
    [10-5-27 17:39:31:921 CST] 578939a1 SystemOut     O 整月
    [10-5-27 17:39:31:921 CST] 578939a1 SystemOut     O 200805
    [10-5-27 17:39:31:921 CST] 578939a1 SystemOut     O 200806
    [10-5-27 17:39:31:921 CST] 578939a1 SystemOut     O 200807
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 200808
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 200809
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 200810
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 200811
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 200812
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 201001
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 201002
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 201003
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 201004
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 整日
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 20080502
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 20080503
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 20080504
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 20080505
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 20080506
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 20080507
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 20080508
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 20080509
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 20080510
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 20080511
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 20080512
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 20080513
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 20080514
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 20080515
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 20080516
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 20080517
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 20080518
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 20080519
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 20080520
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 20080521
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 20080522
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 20080523
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 20080524
    [10-5-27 17:39:31:922 CST] 578939a1 SystemOut     O 20080525
    [10-5-27 17:39:31:923 CST] 578939a1 SystemOut     O 20080526
    [10-5-27 17:39:31:923 CST] 578939a1 SystemOut     O 20080527
    [10-5-27 17:39:31:923 CST] 578939a1 SystemOut     O 20080528
    [10-5-27 17:39:31:923 CST] 578939a1 SystemOut     O 20080529
    [10-5-27 17:39:31:923 CST] 578939a1 SystemOut     O 20080530
      

  6.   


    [10-5-27 17:58:16:754 CST] 578939a1 SystemOut     O 整年
    [10-5-27 17:58:16:754 CST] 578939a1 SystemOut     O 2009
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 整月
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 200805
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 200806
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 200807
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 200808
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 200809
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 200810
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 200811
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 200812
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 201001
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 201002
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 201003
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 201004
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 整日
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 20080505
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 20080506
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 20080507
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 20080508
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 20080509
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 20080510
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 20080511
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 20080512
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 20080513
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 20080514
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 20080515
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 20080516
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 20080517
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 20080518
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 20080519
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 20080520
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 20080521
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 20080522
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 20080523
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 20080524
    [10-5-27 17:58:16:755 CST] 578939a1 SystemOut     O 20080525
    [10-5-27 17:58:16:756 CST] 578939a1 SystemOut     O 20080526
    [10-5-27 17:58:16:756 CST] 578939a1 SystemOut     O 20080527
    [10-5-27 17:58:16:756 CST] 578939a1 SystemOut     O 20080528
    [10-5-27 17:58:16:756 CST] 578939a1 SystemOut     O 20080529
    [10-5-27 17:58:16:756 CST] 578939a1 SystemOut     O 20080530
      

  7.   

    你最头上贴的程序就是你在WebSphere里的程序吧
      

  8.   

    是的,和WebSphere里的一样的。
      

  9.   

    最下面的while循环改成这样跑下看看while (start.before(end)) {
                lts.add(sdf.format(start.getTime()));
                start.add(step, 1);
            }
      

  10.   

    我测的是从20080501到20100527号,测出的数据有问题,如下:[10-5-27 18:20:51:467 CST] 47497e76 SystemOut     O 整年
    [10-5-27 18:20:51:467 CST] 47497e76 SystemOut     O 2009
    [10-5-27 18:20:51:467 CST] 47497e76 SystemOut     O 2010
    [10-5-27 18:20:51:468 CST] 47497e76 SystemOut     O 整月
    [10-5-27 18:20:51:468 CST] 47497e76 SystemOut     O 200805
    [10-5-27 18:20:51:468 CST] 47497e76 SystemOut     O 200806
    [10-5-27 18:20:51:468 CST] 47497e76 SystemOut     O 200807
    [10-5-27 18:20:51:468 CST] 47497e76 SystemOut     O 200808
    [10-5-27 18:20:51:468 CST] 47497e76 SystemOut     O 200809
    [10-5-27 18:20:51:468 CST] 47497e76 SystemOut     O 200810
    [10-5-27 18:20:51:468 CST] 47497e76 SystemOut     O 200811
    [10-5-27 18:20:51:468 CST] 47497e76 SystemOut     O 200812
    [10-5-27 18:20:51:468 CST] 47497e76 SystemOut     O 整日
      

  11.   


    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.List;/**
     * 
     *
     */
    public class DateBetween {    public static void main(String[] args) {
            Calendar start = Calendar.getInstance();
            Calendar end = Calendar.getInstance();
            start.set(2008, 4, 1);// 2008年5月1日
            end.set(2010, 4, 27);// 2010年5月27日
            List[] rtnLists = getDateFigure(start.getTime(), end.getTime());        for (int i = 0; i < rtnLists.length; i++) {
                List lt = rtnLists[i];
                switch (i) {
                case 0:
                    System.out.println("整年");
                    break;
                case 1:
                    System.out.println("整月");
                    break;
                default:
                    System.out.println("整日");
                    break;
                }
                for(int j = 0;j<lt.size();j++){
                    System.out.println(lt.get(j));
                }
            }
        }    /**
         * 
         * @param dStart 起始日期
         * @param dEnd 结束日期
         * @return 整年、整月、整日的数组
         */
        public static List[] getDateFigure(Date dStart, Date dEnd) {
            //@SuppressWarnings("unchecked")
            List[] rtnLists = new List[3];        List ltYear = new ArrayList();
            List ltMonths = new ArrayList();
            List ltDays = new ArrayList();
            rtnLists[0] = ltYear;
            rtnLists[1] = ltMonths;
            rtnLists[2] = ltDays;
            //如果起始日期大于结束日期,返回空数组
            if (dStart.after(dEnd)) {
                return rtnLists;
            }        SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy");
            SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyyMM");
            SimpleDateFormat sdfDay = new SimpleDateFormat("yyyyMMdd");
            Calendar start = Calendar.getInstance();
            start.setTime(dStart);
            Calendar end = Calendar.getInstance();        //Calendar.DAY_OF_YEAR 返回指定年的天数
            //Calendar.DAY_OF_MONTH 返回指定月的天数
            // 非1月1号
            if (start.get(Calendar.DAY_OF_YEAR) != 1) {
                // 非每月1号
                if (start.get(Calendar.DAY_OF_MONTH) != 1) {
                    // 设置到当年月末
                    end.set(start.get(Calendar.YEAR),
                            start.get(Calendar.MONTH) + 1, 1);
                    //end.add(Calendar.DAY_OF_MONTH, -1);
                    if (end.getTime().after(dEnd)) {
                        end.setTime(dEnd);
                    }
                    add(sdfDay,Calendar.DAY_OF_MONTH,ltDays, start, end);
                }
                // 设置结束日期到年末
                if (start.get(Calendar.MONTH) != 0) {
                    end.set(start.get(Calendar.YEAR), 11, 31);
                    if (end.getTime().after(dEnd)) {
                        end.setTime(dEnd);
                        end.set(Calendar.DAY_OF_MONTH, 1);
                    }
                    add(sdfMonth,Calendar.MONTH,ltMonths, start, end);
                }
            }        // 设置结束日期
            end.setTime(dEnd);
            if (end.get(Calendar.MONTH)==11 && end.get(Calendar.DAY_OF_MONTH)==31) {
                end.add(Calendar.YEAR, 1);
            }
            end.set(Calendar.DAY_OF_YEAR, 1);
            //end.set(Calendar.MONTH, 0);
            while (end.after(start)) {
                ltYear.add(sdfYear.format(start.getTime()));
                start.add(Calendar.YEAR, 1);
            }
            //add(sdfYear,Calendar.YEAR,ltYear,start,end);
            // 设置结束日期
            end.setTime(dEnd);
            end.set(Calendar.DAY_OF_MONTH, 1);
            add(sdfMonth,Calendar.MONTH,ltMonths, start, end);        // 设置结束日期
            end.setTime(dEnd);
            end.add(Calendar.DAY_OF_YEAR, 1);
            add(sdfDay,Calendar.DAY_OF_MONTH,ltDays, start, end);
            
            return rtnLists;
        }
        
        /**
         * 
         * @param sdf 日期格式
         * @param step 字段类型
         * @param lts 存放位置
         * @param start 起始日期
         * @param end 结束日期
         */
        private static void add(SimpleDateFormat sdf,int step,List lts, Calendar start,
                Calendar end) {
           
            while (end.after(start)) {
                lts.add(sdf.format(start.getTime()));
                start.add(step, 1);
            }    }}整个换成这样看看
      

  12.   

    如果不行,debug,看下第100行左右那个循环的 while (end.after(start)) {第2次循环时,end.getTime()和start.getTime()的值。
    顺便把打印结果也贴下
      

  13.   

    看一下整日的最后一天有没有进去,如果没有,最后自己添加一次dEnd就可以。应该是ibm那个jdk日期算法有点不一样
      

  14.   

    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.List;public class DateBetween {    public static void main(String[] args) {
            Calendar start = Calendar.getInstance();
            Calendar end = Calendar.getInstance();
            start.set(2008, 4,10);// 2008年5月1日
            end.set(2010, 7, 20);// 2010年5月27日
            List[] rtnLists = getDateFigure(start.getTime(), end.getTime());        for (int i = 0; i < rtnLists.length; i++) {
                List lt = rtnLists[i];
                switch (i) {
                case 0:
                    System.out.println("整年");
                    break;
                case 1:
                    System.out.println("整月");
                    break;
                default:
                    System.out.println("整日");
                    break;
                }
                for(int j = 0;j<lt.size();j++){
                    System.out.println(lt.get(j));
                }
            }
        }    /**
         * 
         * @param dStart 起始日期
         * @param dEnd 结束日期
         * @return 整年、整月、整日的数组
         */
        public static List[] getDateFigure(Date dStart, Date dEnd) {
            //@SuppressWarnings("unchecked")
            List[] rtnLists = new List[3];        List ltYear = new ArrayList();
            List ltMonths = new ArrayList();
            List ltDays = new ArrayList();
            rtnLists[0] = ltYear;
            rtnLists[1] = ltMonths;
            rtnLists[2] = ltDays;
            //如果起始日期大于结束日期,返回空数组
            if (dStart.after(dEnd)) {
                return rtnLists;
            }        SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy");
            SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyyMM");
            SimpleDateFormat sdfDay = new SimpleDateFormat("yyyyMMdd");
            Calendar start = Calendar.getInstance();
            start.setTime(dStart);
            Calendar end = Calendar.getInstance();        //Calendar.DAY_OF_YEAR 返回指定年的天数
            //Calendar.DAY_OF_MONTH 返回指定月的天数
            // 非1月1号
            if (start.get(Calendar.DAY_OF_YEAR) != 1) {
                // 非每月1号
                if (start.get(Calendar.DAY_OF_MONTH) != 1) {
                    // 设置到当年月末
                    end.set(start.get(Calendar.YEAR),
                            start.get(Calendar.MONTH) + 1, 1);
                    end.add(Calendar.DAY_OF_MONTH, -1);
                    if (end.getTime().after(dEnd)) {
                        end.setTime(dEnd);
                    }
                    add(sdfDay,Calendar.DAY_OF_MONTH,ltDays, start, end);
                }            end.setTime(dEnd);
                // 设置结束日期到年末
                if (start.get(Calendar.MONTH) != 0 && start.get(Calendar.YEAR) < end.get(Calendar.YEAR) ) {      
                    end.set(start.get(Calendar.YEAR), 11, 31);
                    if (end.getTime().after(dEnd)) {
                        end.setTime(dEnd);
                        end.set(Calendar.DAY_OF_MONTH, 1);
                    }
                    add(sdfMonth,Calendar.MONTH,ltMonths, start, end);
                }
            }        // 设置结束日期
            end.setTime(dEnd);
            if (start.get(Calendar.YEAR) < end.get(Calendar.YEAR)) {
                end.set(Calendar.DAY_OF_YEAR, 1);
                end.add(Calendar.DAY_OF_YEAR, -1);
                add(sdfYear,Calendar.YEAR,ltYear,start,end);
            }
            
            // 设置结束日期
            end.setTime(dEnd);
            end.set(Calendar.DAY_OF_MONTH, 1);
            end.add(Calendar.DAY_OF_YEAR, -1);
            add(sdfMonth,Calendar.MONTH,ltMonths, start, end);        // 设置结束日期
            end.setTime(dEnd);
            add(sdfDay,Calendar.DAY_OF_MONTH,ltDays, start, end);
            
            return rtnLists;
        }
        
        /**
         * 
         * @param sdf 日期格式
         * @param step 字段类型
         * @param lts 存放位置
         * @param start 起始日期
         * @param end 结束日期
         */
        private static void add(SimpleDateFormat sdf,int step,List lts, Calendar start,
                Calendar end) { 
            while (end.after(start) || end.equals(start)) {
                lts.add(sdf.format(start.getTime()));
                start.add(step, 1);
            }
        }}
      

  15.   

    再改下,好久之前写的了,哈哈。
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.List;public class DateBetween {    public static void main(String[] args) {
            Calendar start = Calendar.getInstance();
            Calendar end = Calendar.getInstance();
            start.set(2008, 4,1);// 2008年5月1日
            end.set(2010, 3, 30);// 2010年5月27日
            List[] rtnLists = getDateFigure(start.getTime(), end.getTime());        for (int i = 0; i < rtnLists.length; i++) {
                List lt = rtnLists[i];
                switch (i) {
                case 0:
                    System.out.println("整年");
                    break;
                case 1:
                    System.out.println("整月");
                    break;
                default:
                    System.out.println("整日");
                    break;
                }
                for(int j = 0;j<lt.size();j++){
                    System.out.println(lt.get(j));
                }
            }
        }    /**
         * 
         * @param dStart 起始日期
         * @param dEnd 结束日期
         * @return 整年、整月、整日的数组
         */
        public static List[] getDateFigure(Date dStart, Date dEnd) {
            //@SuppressWarnings("unchecked")
            List[] rtnLists = new List[3];        List ltYear = new ArrayList();
            List ltMonths = new ArrayList();
            List ltDays = new ArrayList();
            rtnLists[0] = ltYear;
            rtnLists[1] = ltMonths;
            rtnLists[2] = ltDays;
            //如果起始日期大于结束日期,返回空数组
            if (dStart.after(dEnd)) {
                return rtnLists;
            }        SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy");
            SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyyMM");
            SimpleDateFormat sdfDay = new SimpleDateFormat("yyyyMMdd");
            Calendar start = Calendar.getInstance();
            start.setTime(dStart);
            Calendar end = Calendar.getInstance();        //Calendar.DAY_OF_YEAR 返回指定年的天数
            //Calendar.DAY_OF_MONTH 返回指定月的天数
            // 非1月1号
            if (start.get(Calendar.DAY_OF_YEAR) != 1) {
                // 非每月1号
                if (start.get(Calendar.DAY_OF_MONTH) != 1) {
                    // 设置到当年月末
                    end.set(start.get(Calendar.YEAR),
                            start.get(Calendar.MONTH) + 1, 1);
                    end.add(Calendar.DAY_OF_MONTH, -1);
                    if (end.getTime().after(dEnd)) {
                        end.setTime(dEnd);
                    }
                    add(sdfDay,Calendar.DAY_OF_MONTH,ltDays, start, end);
                }            end.setTime(dEnd);
                // 设置结束日期到年末
                if (start.get(Calendar.MONTH) != 0 && start.get(Calendar.YEAR) < end.get(Calendar.YEAR) ) {      
                    end.set(start.get(Calendar.YEAR), 11, 31);
                    if (end.getTime().after(dEnd)) {
                        end.setTime(dEnd);
                        end.set(Calendar.DAY_OF_MONTH, 1);
                    }
                    add(sdfMonth,Calendar.MONTH,ltMonths, start, end);
                }
            }        // 设置结束日期,计算整年
            end.setTime(dEnd);
            if (start.get(Calendar.YEAR) < end.get(Calendar.YEAR)) {
                end.set(Calendar.DAY_OF_YEAR, 1);
                end.add(Calendar.DAY_OF_YEAR, -1);
                add(sdfYear,Calendar.YEAR,ltYear,start,end);
            }
            
            // 设置结束日期
            end.setTime(dEnd);
            Calendar comp = Calendar.getInstance();
            comp.setTime(dEnd);
            comp.add(Calendar.DAY_OF_YEAR, 1);
            if (comp.get(Calendar.MONTH) == end.get(Calendar.MONTH)) {
                end.set(Calendar.DAY_OF_MONTH, 1);
                end.add(Calendar.DAY_OF_YEAR, -1);
            } 
            add(sdfMonth,Calendar.MONTH,ltMonths, start, end);        // 设置结束日期
            end.setTime(dEnd);
            add(sdfDay,Calendar.DAY_OF_MONTH,ltDays, start, end);
            
            return rtnLists;
        }
        
        /**
         * 
         * @param sdf 日期格式
         * @param step 字段类型
         * @param lts 存放位置
         * @param start 起始日期
         * @param end 结束日期
         */
        private static void add(SimpleDateFormat sdf,int step,List lts, Calendar start,
                Calendar end) { 
            while (end.after(start) || end.equals(start)) {
                lts.add(sdf.format(start.getTime()));
                start.add(step, 1);
            }
        }}
      

  16.   


    改得匆忙了,这个大致都测试了下,再试下。有问题留言给我吧。先去睡了
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.List;public class DateBetween {    public static void main(String[] args) {
            Calendar start = Calendar.getInstance();
            Calendar end = Calendar.getInstance();
            start.set(2010,4,1);// 2008年5月1日
            end.set(2010,4,27);// 2010年5月27日
            List[] rtnLists = getDateFigure(start.getTime(), end.getTime());        for (int i = 0; i < rtnLists.length; i++) {
                List lt = rtnLists[i];
                switch (i) {
                case 0:
                    System.out.println("整年");
                    break;
                case 1:
                    System.out.println("整月");
                    break;
                default:
                    System.out.println("整日");
                    break;
                }
                for(int j = 0;j<lt.size();j++){
                    System.out.println(lt.get(j));
                }
            }
        }    /**
         * 
         * @param dStart 起始日期
         * @param dEnd 结束日期
         * @return 整年、整月、整日的数组
         */
        public static List[] getDateFigure(Date dStart, Date dEnd) {        List[] rtnLists = new List[3];        List ltYear = new ArrayList();
            List ltMonths = new ArrayList();
            List ltDays = new ArrayList();
            rtnLists[0] = ltYear;
            rtnLists[1] = ltMonths;
            rtnLists[2] = ltDays;
            //如果起始日期大于结束日期,返回空数组
            if (dStart.after(dEnd)) {
                return rtnLists;
            }        SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy");
            SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyyMM");
            SimpleDateFormat sdfDay = new SimpleDateFormat("yyyyMMdd");
            Calendar start = Calendar.getInstance();
            start.setTime(dStart);
            Calendar end = Calendar.getInstance();
            Calendar comp = Calendar.getInstance();
            comp.setTime(dEnd);
            comp.add(Calendar.DAY_OF_YEAR, 1);        // 非1月1号
            if (start.get(Calendar.DAY_OF_YEAR) != 1) {
                // 非每月1号
                if (start.get(Calendar.DAY_OF_MONTH) != 1) {
                    // 设置到当年月末
                    end.set(start.get(Calendar.YEAR),
                            start.get(Calendar.MONTH) + 1, 1);
                    end.add(Calendar.DAY_OF_MONTH, -1);
                    if (end.getTime().after(dEnd)) {
                        end.setTime(dEnd);
                    }
                    add(sdfDay,Calendar.DAY_OF_MONTH,ltDays, start, end);
                }            end.setTime(dEnd);
                // 设置结束日期到年末
                if (start.get(Calendar.MONTH) != 0 && start.get(Calendar.YEAR) < end.get(Calendar.YEAR) ) {      
                    end.set(start.get(Calendar.YEAR), 11, 31);
                    if (end.getTime().after(dEnd)) {
                        end.setTime(dEnd);
                        end.set(Calendar.DAY_OF_MONTH, 1);
                    }
                    add(sdfMonth,Calendar.MONTH,ltMonths, start, end);
                }
            }        // 设置结束日期,计算整年
            end.setTime(dEnd);
            // 结束日期为年末
            if(comp.get(Calendar.DAY_OF_YEAR) == 1){
                add(sdfYear,Calendar.YEAR,ltYear,start,end);
            }
            // 结束日期非年末
            if (start.get(Calendar.YEAR) < end.get(Calendar.YEAR)) {      
                //设置到前一年年末
                end.set(Calendar.DAY_OF_YEAR, 1);
                end.add(Calendar.DAY_OF_YEAR, -1);
                add(sdfYear,Calendar.YEAR,ltYear,start,end);
            }
            
            // 设置结束日期
            end.setTime(dEnd);
            // 计算整月
            if (comp.get(Calendar.MONTH) == end.get(Calendar.MONTH)) {
                end.set(Calendar.DAY_OF_MONTH, 1);
                end.add(Calendar.DAY_OF_YEAR, -1);
            } 
            add(sdfMonth,Calendar.MONTH,ltMonths, start, end);        // 设置结束日期
            end.setTime(dEnd);
            add(sdfDay,Calendar.DAY_OF_MONTH,ltDays, start, end);
            
            return rtnLists;
        }
        
        /**
         * 
         * @param sdf 日期格式
         * @param step 字段类型
         * @param lts 存放位置
         * @param start 起始日期
         * @param end 结束日期
         */
        private static void add(SimpleDateFormat sdf,int step,List lts, Calendar start,
                Calendar end) { 
            while (end.after(start) || end.equals(start)) {
                lts.add(sdf.format(start.getTime()));
                start.add(step, 1);
            }
        }}