A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© doyxy 中级黑马   /  2014-3-26 20:32  /  1691 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 doyxy 于 2014-3-28 23:07 编辑

想做一个程序获取两个日期之间的工作日和休息日天数,当天数相差2天以内而且前面的日期大于后面的日期时,返回值错误,
比如 2014.03.26 - 2014.03.25 时,输出4,-4,
如果正序则正常,
发觉同一个星期时判断有问题,但是想不出怎么处理,求教应该怎么处理,谢谢!


  1. import java.util.Calendar;
  2. import java.util.Date;

  3. public class Improve {

  4.         /**
  5.          * @param args
  6.          */
  7.         public static void main(String[] args) {
  8.                 // TODO Auto-generated method stub
  9.                 // 练习4,获取两个日期间的工作天数和休息天数,包含头不包含尾.
  10.                 // System.out.println("workdays:" + getWorkdays(2014, 2, 1, 2014, 1,
  11.                 // 31));
  12.                 Calendar c1 = Calendar.getInstance();
  13.                 Calendar c2 = Calendar.getInstance();
  14.                 c1.set(2014, 2, 26);
  15.                 c2.set(2014, 2, 25);
  16.                 int workdays = getWorkdays(c1.getTime(), c2.getTime());
  17.                 int restdays = getrestdays(c1.getTime(), c2.getTime());
  18.                 System.out.println(c1.getTime());
  19.                 System.out.println(c2.getTime());
  20.                 System.out.println("workdays:" + workdays);
  21.                 System.out.println("restdays:" + restdays);
  22.         }

  23.         private static int getrestdays(Date d1, Date d2) {
  24.                 // TODO Auto-generated method stub
  25.                 return (getTotaleDays(d1, d2)-getWorkdays(d1, d2));
  26.         }

  27.         private static int getWorkdays(Date d1, Date d2) {
  28.                 // TODO Auto-generated method stub
  29.                 // 获取两个日期间的总天数.
  30.                 // 判断第一周和最后一周包含多少工作日和休息日 ow1,or1,ow2,or2.
  31.                 // 总天数减去头尾两周的天数(ow1+or1+ow2+ow2)就是包含完整星期的天数,
  32.                 // 除以7即得星期数,*5为工作日,*2为休息日,加上上面的工作日和休息日即得总的天数.
  33.                 int workDays;
  34.                 Calendar c1 = Calendar.getInstance();
  35.                 Calendar c2 = Calendar.getInstance();
  36.                
  37.                 c1.setTime(d1);
  38.                 c2.setTime(d2);
  39.                 int days = getTotaleDays(d1, d2);//获取总天数
  40.                 int ow1, or1, ow2, or2;
  41.                 // 当两个时间在同一星期时出错
  42.                 // 获取开始日期是星期几
  43.                 int weekC1 = c1.get(Calendar.DAY_OF_WEEK);// 1-7代表星期日-星期六,
  44.                 int weekC2 = c2.get(Calendar.DAY_OF_WEEK);
  45.                 /*
  46.                  * 第一周
  47.                  * 1-SUNDAY ow+5 or+2
  48.                  * 2-MONDAY ow+5 or+1
  49.                  * 3-TUESDAY ow+4 or+1
  50.                  * 4-WEDNESDAY ow+3 or+1
  51.                  * 5-THURSDAY ow+2 or+1
  52.                  * 6-FRIDAY ow+1 or+1
  53.                  * 7-SATURDAY ow+0 or+1
  54.                  * 除了SUNDAY ow = 7-weekC1,or=1;
  55.                  */
  56.                 // 获取第一周的工作日ow1和休息日or1天数.
  57.                 if (weekC1 == 1) {
  58.                         ow1 = 5;
  59.                         or1 = 2;
  60.                 } else {
  61.                         ow1 = 7 - weekC1;
  62.                         or1 = 1;
  63.                 }
  64.                 /*
  65.                  * 最后一周,因为不包含最后一天
  66.                  * 1-SUNDAY ow+0 or+0
  67.                  * 2-MONDAY ow+0 or+1
  68.                  * 3-TUESDAY ow+1 or+1
  69.                  * 4-WEDNESDAY ow+2 or+1
  70.                  * 5-THURSDAY ow+3 or+1
  71.                  * 6-FRIDAY ow+4 or+1
  72.                  * 7-SATURDAY ow+5 or+1
  73.                  * 除了SUNDAY ow=weekC2-2, or=1;
  74.                  */
  75.                 // 获取最后一周的工作日ow2和休息日or2天数.
  76.                 if (weekC2 == 1) {
  77.                         ow2 = 0;
  78.                         or2 = 0;
  79.                 } else {
  80.                         ow2 = weekC2 - 2;
  81.                         or2 = 1;
  82.                 }
  83.                 int fullWeeks;
  84.                 // 完整星期的天数
  85.                 fullWeeks = (days - ow1 - or1 - ow2 - or2) / 7;
  86. //                System.out.println("完整星期数:"+fullWeeks);
  87. //                System.out.println("ow1="+ow1+",ow2="+ow2);
  88.                 workDays = fullWeeks * 5 + ow1 + ow2;
  89.                
  90.                 return workDays;
  91.         }

  92.         private static int getTotaleDays(Date d1, Date d2) {
  93.                 Calendar c1 = Calendar.getInstance();
  94.                 Calendar c2 = Calendar.getInstance();
  95.                 c1.setTime(d1);
  96.                 c2.setTime(d2);
  97.                 // 判断c1和c2的大小,保证c1在前,c2在后.
  98.                 if (c1.compareTo(c2) > 0) {
  99.                         c1.setTime(d2);
  100.                         c2.setTime(d1);
  101.                         System.out.println("c1>c2");
  102.                 }
  103.                 // 获取c1和c2间的天数
  104.                 int days = (int) ((c2.getTimeInMillis() - c1.getTimeInMillis()) / (1000 * 3600 * 24));
  105. //                System.out.println(days);
  106.                 return days;
  107.         }

  108.         
  109. }
复制代码



评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

5 个回复

倒序浏览
首先 时间相差天数,你只是证明的了哪个在前哪个在后,输出值也没变,有可能是负数也有可能是正数,把比较后的结果要作用 在结果上。这是我的代码
回复 使用道具 举报

                //得到两个日期相差的天数   
                int days1 = ((int) (c2.getTime().getTime() / 1000) - (int) (c1
                       .getTime().getTime() / 1000)) / 3600 / 24;   
              
                System.out.println(c1.getTime());
                System.out.println(c2.getTime());
                if(days1 > 0){
                        System.out.println("相差"+days1+"天");
                           return days1;
                }else{
                        int days2 = 0 - days1;
                        System.out.println("相差"+days2+"天");
                           return days2;
                }
其次,你上面也注释了 // 当两个时间在同一星期时出错
      出错也是应该的, 这是你计算星期天的代码           fullWeeks = (days - ow1 - or1 - ow2 - or2) / 7;
      如果是周一到周三,工作了三天总的天数是三,0除7肯定不能进行啊,所以你要判读他们是不是在同一周,如果是的话,重新写一个判断方法
不知道你注意到了没:calendar存储月份是从0开始存储的 即0就是1月

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
感谢楼上,不过我自己重新想了个办法,我错在判断第一周和最后一周的工作日和休息日直接用赋值,重新写了一个,请大家指点

  1. import java.util.Calendar;
  2. import java.util.Date;

  3. public class GetWorkDays {

  4.         /**
  5.          * @param args
  6.          */
  7.         public static void main(String[] args) {
  8.                 // TODO Auto-generated method stub
  9.                 // 获取两个日期之间的工作日天数
  10.                 Calendar c1 = Calendar.getInstance();
  11.                 Calendar c2 = Calendar.getInstance();
  12.                 c1.set(2014, 2, 2);
  13.                 c2.set(2014, 2, 1);
  14.                 System.out.println(c1.getTime());
  15.                 System.out.println(c2.getTime());
  16.                 System.out.println("workdays:"
  17.                                 + getWorkdays(c1.getTime(), c2.getTime()));
  18.                 System.out.println("restdays:"
  19.                                 + getRestdays(c1.getTime(), c2.getTime()));
  20.         }

  21.         private static int getRestdays(Date d1, Date d2) {
  22.                 // TODO Auto-generated method stub
  23.                 Calendar c1 = Calendar.getInstance();
  24.                 Calendar c2 = Calendar.getInstance();
  25.                 c1.setTime(d1);
  26.                 c2.setTime(d2);
  27.                 if (d1.compareTo(d2) > 0) {
  28.                         c1.setTime(d2);
  29.                         c2.setTime(d1);
  30.                 }
  31.                 int totalDays = (int) ((c2.getTimeInMillis() - c1.getTimeInMillis()) / (1000 * 3600 * 24));
  32.                 return totalDays - getWorkdays(d1, d2);
  33.         }

  34.         private static int getWorkdays(Date d1, Date d2) {
  35.                 // TODO Auto-generated method stub
  36.                 int workdays = 0;
  37.                 Calendar c1 = Calendar.getInstance();
  38.                 Calendar c2 = Calendar.getInstance();
  39.                 c1.setTime(d1);
  40.                 c2.setTime(d2);
  41.                 // 如果d2在d1之前,将两个日期互换.
  42.                 if (d1.compareTo(d2) > 0) {
  43.                         c1.setTime(d2);
  44.                         c2.setTime(d1);
  45.                 }
  46.                 // 此时d1在d2之前.

  47.                 // 获取d1和d2之间的天数.
  48.                 int totalDays = (int) ((c2.getTimeInMillis() - c1.getTimeInMillis()) / (1000 * 3600 * 24));

  49.                 int weekC1 = c1.get(Calendar.DAY_OF_WEEK);
  50.                 int weekC2 = c2.get(Calendar.DAY_OF_WEEK);
  51.                 // 如果d1和d2之间没有完整的星期
  52.                 // 并且d1和d2在同一个星期
  53.                 if (totalDays < 7
  54.                                 && c1.get(Calendar.WEEK_OF_YEAR) == c2
  55.                                                 .get(Calendar.WEEK_OF_YEAR)) {
  56.                         // 如果d1为星期天
  57.                         if (weekC1 == 1) {
  58.                                 workdays = weekC2 - weekC1 - 1;
  59.                         } else {
  60.                                 workdays = weekC2 - weekC1;
  61.                         }
  62.                 } else {// 如果d1和d2不在同一星期
  63.                         // 分别获取d1和d2所在星期的工作日天数
  64.                         int workdays1, workdays2;

  65.                         if (weekC1 == 1) {
  66.                                 workdays1 = 7 - weekC1 - 1;
  67.                         } else {
  68.                                 workdays1 = 7 - weekC1;
  69.                         }
  70.                         if (weekC2 == 1 || weekC2 == 2) {
  71.                                 workdays2 = 0;
  72.                         } else {
  73.                                 workdays2 = weekC2 - 2;
  74.                         }

  75.                         // 获取d1和d2之间有多少个完整的星期
  76.                         // 总天数减去第一个星期和最后一个星期的天数/7
  77.                         int fullWeeks = (totalDays - (7 - weekC1 + 1) - (weekC2 - 1)) / 7;
  78.                         // 总的工作日
  79.                         workdays = fullWeeks * 5 + workdays1 + workdays2;
  80.                 }
  81.                 return workdays;
  82.         }

  83. }
复制代码



回复 使用道具 举报
无语,发现跨年的话会出错,打印两个时间的毫秒值发现差1,看来在Calendar.getInstance()的时候出的问题,直接用new Date就没问题了,感觉new Date创建时间很好用啊,怎么就过时了呢....

snap0031.png (130.22 KB, 下载次数: 31)

snap0031.png
回复 使用道具 举报
最终修改版 测试了两个日期在同一星期,在相邻星期,跨年相邻星期,都没问题,各位看看还有什么地方要改进的吗?

  1. package SystemTest;

  2. import java.util.Calendar;
  3. import java.util.GregorianCalendar;

  4. public class GetWorkdays {

  5.         /**
  6.          * @param args
  7.          */
  8.         public static void main(String[] args) {
  9.                 // TODO Auto-generated method stub
  10.                 // 获取两个日期之间的工作日天数
  11.                 GregorianCalendar c1 = new GregorianCalendar(2014, 0, 8);
  12.                 GregorianCalendar c2 = new GregorianCalendar(2014, 0, 10);
  13.                 System.out.println("workdays:" + getWorkdays(c1, c2));
  14.                 System.out.println("restdays:" + getRestdays(c1, c2));
  15.         }

  16.         private static int getRestdays(GregorianCalendar g1, GregorianCalendar g2) {
  17.                 // TODO Auto-generated method stub
  18.                 if (g1.after(g2)) {
  19.                         GregorianCalendar temp = g1;
  20.                         g1 = g2;
  21.                         g2 = temp;
  22.                 }
  23.                 int totalDays = (int) ((g2.getTimeInMillis() - g1.getTimeInMillis()) / (1000 * 3600 * 24));
  24.                 return totalDays - getWorkdays(g1, g2);
  25.         }

  26.         private static int getWorkdays(GregorianCalendar g1, GregorianCalendar g2) {
  27.                 // TODO Auto-generated method stub
  28.                 int workdays = 0;
  29.                 // 如果g2在g1之前,将两个日期互换.
  30.                 if (g1.after(g2)) {
  31.                         GregorianCalendar temp = g1;
  32.                         g1 = g2;
  33.                         g2 = temp;
  34.                 }

  35.                 // 获取g1和d2之间的天数.
  36.                 int totalDays = (int) ((g2.getTimeInMillis() - g1.getTimeInMillis()) / (1000 * 3600 * 24));

  37.                 int weekC1 = g1.get(Calendar.DAY_OF_WEEK);
  38.                 int weekC2 = g2.get(Calendar.DAY_OF_WEEK);
  39.                 // 分别获取d1和d2所在星期的工作日天数
  40.                 int workdays1, workdays2;

  41.                 if (weekC1 == 1) {
  42.                         workdays1 = 7 - weekC1 - 1;
  43.                 } else {
  44.                         workdays1 = 7 - weekC1;
  45.                 }
  46.                 if (weekC2 == 1 || weekC2 == 2) {
  47.                         workdays2 = 0;
  48.                 } else {
  49.                         workdays2 = weekC2 - 2;
  50.                 }

  51.                 // 获取d1和d2之间有多少个完整的星期
  52.                 // 总天数减去第一个星期和最后一个星期的天数/7
  53.                 int fullWeeks = (totalDays - (7 - weekC1 + 1) - (weekC2 - 1)) / 7;
  54.                 // 总的工作日
  55.                 workdays = fullWeeks * 5 + workdays1 + workdays2;
  56.                 // }
  57.                 return workdays;
  58.         }

  59. }
复制代码



回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马