我要的是一个简单的算法计算2个时间间隔的工作日,也就是除去周六和周日,哪位能提供个算法思路,多谢!最好详细点~~~

解决方案 »

  1.   

    看下是不是对的public static void main(String[] args) {
    try {
    System.out.println(check(string2Date("2010-4-29"),string2Date("2011-6-4")));
    } catch (Exception e) {
    e.printStackTrace();
    }
    } public static int check(Date beginDate, Date endDate) throws Exception { Calendar cal = Calendar.getInstance();
    cal.setTime(beginDate);
    Integer beginYear = cal.get(Calendar.YEAR); cal.setTime(endDate);
    Integer endYear = cal.get(Calendar.YEAR);
    if (beginYear == endYear) {
    return betweenDaysInSameYear(beginDate, endDate);
    } else {
    int sumDays = 0;
    for (Integer i = beginYear; i <= endYear; i++) {
    if (i == beginYear) {
    sumDays += betweenDaysInSameYear(beginDate, string2Date(i.toString()+ "-12-31"));
    } else if (i == endYear) {
    sumDays += betweenDaysInSameYear(string2Date(i.toString()+ "-1-1"), endDate);
    } else {
    sumDays += betweenDaysInSameYear(string2Date(i.toString()+ "-1-1"), string2Date(i.toString() + "-12-31"));
    }
    }
    return sumDays;
    }
    } public static int betweenDaysInSameYear(Date beginDate, Date endDate) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(beginDate);
    int beginWeek = cal.get(Calendar.WEEK_OF_YEAR);
    int beginDay = cal.get(Calendar.DAY_OF_WEEK); cal.setTime(endDate);
    int endWeek = cal.get(Calendar.WEEK_OF_YEAR);
    int endDay = cal.get(Calendar.DAY_OF_WEEK); int beginDays = 0;
    int endDays = 0;
    switch (beginDay) {
    case Calendar.SATURDAY:
    beginDays = 0;
    break;
    case Calendar.SUNDAY:
    beginDays = 0;
    break;
    default:
    beginDays = Calendar.FRIDAY - beginDay + 1;
    break;
    }
    switch (endDay) {
    case Calendar.SATURDAY:
    endDays = 5;
    break;
    case Calendar.SUNDAY:
    endDays = 5;
    break;
    default:
    endDays = endDay - 1;
    break;
    }
    return beginDays+ ((endWeek - beginWeek - 2) * 5 < 0 ? 0 : ((endWeek- beginWeek - 2) * 5)) + endDays;
    } public static Date string2Date(String dateStr) throws Exception {
    SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
    return fmt.parse(dateStr);
    }
      

  2.   

    回去重新看了一下WEEKDAY函数,发现昨天因为粗心,使自己考虑的麻烦了很多
    先解释一下WEEKDAY函数
    WEEKDAY函数返回某日期的星期数。在默认情况下,它的值为1(星期天)到7(星期六)之间的一个整数。
    既然这样,我的想法如下:
    1.可以先得到两个日期的星期数。并将较早的那一日期前推到上一个星期的周日(如果前一日起本就在周日,则不用前推),后一日期推后到本周六,并记录两次修改之后增加的天数,DAYADD1和DAYADD2。
    2.计算出前后两个日期相隔的总天数,并加上DAYADD1和DAYADD2,得到两个日期改变后的总天数DAYALL(当然,这个数肯定是7的倍数。为什么?因为一个星期就只有7天)。
    3.现在可以计算工作日的总天数了:
    总工作日WEEKDAY=DAYALL-DAYADD1-DAYADD2-2(DAYALL/7)
    解释一下上面:从改变(即前一日期前推,后一日期后推)后的总天数DAYALL,去掉改变日期时所增加的天数DAYADD1和DAYADD2,当然,还要去掉这段时间内的周末即后面的2(DAYALL/7)当然,这里需要判断一下,如果前一日期非周日,则需要在上面得到的结果中加1,后一日期非周六的时候,同样结果中要加1。最后得到的结果就是这一段时间内的总工作日天数。
      

  3.   

    昨天时候粗心,把WEEKDAY函数记成:从周六开始返回星期数。
    如果是那样的话,还要判断日期为周六或周日,或者非周末的情况。因为这几个情况下,结果需要另加的天数不同
      

  4.   

    我也做个类似的问题,算法:
    1.计算首日的那个星期,将这个星期的工作日计算出来,记为A
    2.计算结束日的那个星期,经那个星期的工作日计算出来,记为B
    3.计算首日和结束日之间整的星期数,记为C
    4.总工作日数: A + B + C * 7 
      

  5.   

    @Test
    public void testExecute2() {
    Calendar before = Calendar.getInstance();
    before.set(2012, 0, 5);

    Calendar now = Calendar.getInstance();
    now.setTime(new Date());

    int i=0;
    while(now.after(before)){
    int dayOfWeek = before.get(Calendar.DAY_OF_WEEK);
    System.out.println(EDateUtils.formatDate(before.getTime()));
    if(dayOfWeek==Calendar.SATURDAY||dayOfWeek==Calendar.SUNDAY){

    }else{
    i++;
    }
    before.add(Calendar.DATE, 1);
    }
    System.out.println(i);
    }
      

  6.   

    计算工作日,不是简单的星期六、星期日的问题,要考虑节假日,还要考虑星期六、星期天上班的情况,因为每年的节假日不同,各地区的节假日也不通,所以做了个xml可以根据具体的放假及调休时间设置,然后再根据程序来判断。下面是自己写的一个指定日期到当前日期的工作日计算方法:private long whtime(Date sqrq) throws AppException {
            Date begDate = sqrq, endDate = new Date();
            getDaysStringList();
            //初始化申请日期
            while (!isWorkDay(begDate)) {
                begDate = getNextDay(begDate);
            }
            while (!isWorkDay(endDate)) {
                endDate = getNextDay(endDate);
            }        long quot = endDate.getTime() - begDate.getTime();
            int holidays=0;
            Date currDate=new Date();
            currDate=RelativeDate.getDate(RelativeDate.getDateString(begDate, "yyyy-MM-dd HH:mm:ss"), "yyyy-MM-dd HH:mm:ss");
            String currDateString=RelativeDate.getDateString(currDate, "yyyy-MM-dd");
            String endDateString=RelativeDate.getDateString(endDate, "yyyy-MM-dd");
            while(!currDateString.equals(endDateString)){
                currDate=RelativeDate.daysAfter(currDate, 1);
                currDateString=RelativeDate.getDateString(currDate, "yyyy-MM-dd");
                if(!isWorkDay(currDate)){
                    holidays++;
                }
            }
            quot=quot- holidays*1000*3600*24;
            return quot;
        }    private boolean isWorkDay(Date theDate) throws AppException {
            String dayTmp = "";
            try {
                //初始化申请日期
                int iDayOfWeek = getDayOfWeek(theDate);
                dayTmp = RelativeDate.getDateString(theDate, "MM-dd");
                if (iDayOfWeek == 1) {
                    if (WorkdayList.indexOf(dayTmp) < 0) {
                        return false;
                    }
                } else if (iDayOfWeek == 7) {
                    if (WorkdayList.indexOf(dayTmp) < 0) {
                        return false;
                    }
                } else {
                    if (HolidayList.indexOf(dayTmp) >= 0) {
                        return false;
                    }
                }
            } catch (Exception e) {
                throw new AppException("获得日期错误");
            }
            return true;
        }    private Date getNextDay(Date theDate) throws AppException {
            String fullDayTmp = RelativeDate.getDateString(RelativeDate.daysAfter(theDate, 1), "yyyy-MM-dd") + " 00:00:01";
            return RelativeDate.getDate(fullDayTmp, "yyyy-MM-dd HH:mm:ss");
        }    private void getDaysStringList() throws AppException {
            String crossTableConfigXmlPath = InitParameter.getRealPath() + InitParameter.getWhHolidayXml() + ".xml";
            try {
                SAXBuilder builder = new SAXBuilder();
                Document doc = builder.build(crossTableConfigXmlPath);            Element root = doc.getRootElement();
                List children = root.getChildren();
                for (int i = 0; i < children.size(); i++) {
                    Element node = (Element) children.get(i);
                    if (node.getName().toLowerCase().equals("holiday")) {
                        Attribute attr = node.getAttribute("days");
                        if (attr != null) {
                            HolidayList = attr.getValue();
                        }
                    } else if (node.getName().toLowerCase().equals("workday")) {
                        Attribute attr = node.getAttribute("days");
                        if (attr != null) {
                            WorkdayList = attr.getValue();
                        }
                    }
                }
            } catch (Exception e) {
                throw new AppException(e);
            }
        }    /**
         * 返回传入日期所在的日
         * @param d_date
         * @return
         * @throws java.lang.Exception
         */
        private static int getDayOfWeek(Date d_date) throws Exception {
            Calendar c = Calendar.getInstance();
            c.setTime(d_date);
            return c.get(Calendar.DAY_OF_WEEK);    }
    可以修改的xml配置文件:<?xml version="1.0" encoding="UTF-8"?><root>
        <holiday days="01-02,01-03,01-23,01-24,01-25,01-26,01-27,04-02,04-03,04-04,04-30,05-01,06-22,10-01,10-02,10-03,10-04,10-05"/>
        <workday days="01-21,01-29,03-31,04-01,04-28,09-29"/>
    </root>
      

  7.   


    public static void main(String []args){
    Calendar c1 = Calendar.getInstance();
    Calendar c2 = Calendar.getInstance();
    int num = 0;
    c1.set(2011, 12-1, 1);
    c2.set(2012, 1-1, 1);
    for(Calendar tmp = c1;c1.getTime().compareTo(c2.getTime())<0;c1.add(c1.DAY_OF_YEAR, 1)){
    if(tmp.getTime().getDay()!=6&&tmp.getTime().getDay()!=0){
    num++;
    }
    }
    System.out.println("=============================");
    System.out.println(num);
    }
    试下这个