开发者社区 问答 正文

java中时间间隔小时计算

计算两个时间间隔小时且不包括周末,每天8小时,eg 2015-05-10 10:00:00
2015-05-20 16:00:00 要算出这两个时间相差的小时数而且不包括周末时间,其他时间一天8小时计算
并且 10:00 到18点,9点到16点这两个时间点也要计算上,该怎么写?

展开
收起
蛮大人123 2016-03-18 15:14:30 2775 分享 版权
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    public class CalculateHours {
    //该处时间可以根据实际情况进行调整
    int ab = 8;//上午上班时间
    int ae = 12;//下午下班时间
    int pb = 13;//下午上班时间
    int pe = 17;//下午下班时间
    int hoursPerDay = ae-ab+pe-pb;//每天上班小时数
    int daysPerWeek = 5;//每周工作天数
    long milsecPerDay = 1000*60*60*24;//每天的毫秒数
    int hoursPerWeek = hoursPerDay*daysPerWeek;//每星期小时数
    public int calculateHours(String beginTime, String endTime){
        Date t1 = stringToDate(beginTime);//真实开始时间
        Date t2 = stringToDate(endTime);//真实结束时间
        if(t1.getTime()>t2.getTime())
            return -1;
        if(t1.getYear()==t2.getYear()&&t1.getMonth()==t2.getMonth()&&t1.getDate()==t2.getDate()){
            if(t2.getHours()<=ab||t1.getHours()>pe||(t1.getHours()>=ae&&t2.getHours()<=pb)){
                return 0;
            }
            if(t1.getHours()<=ab){
                return calculateHoursInOneDay2(t2.getHours());
            }
            if(t2.getHours()>=pe){
                return calculateHoursInOneDay(t1.getHours());
            }
            if(t2.getHours()<=ae||t1.getHours()>=pb){
                return t2.getHours() - t1.getHours();
            }
            if(t1.getHours()<=ae&&t2.getHours()>=pb){
                return t2.getHours()-t1.getHours()-(pb-ae);
            }
            if(t2.getHours()<=pb){
                return ae-t1.getHours();
            }
            return t2.getHours()-pb;
        }
        //开始时间当天,上午上班时间
        Date temp1 = new Date(t1.getYear(),t1.getMonth(),t1.getDate(),ab,0);
        //结束时间当天,上午上班时间
        Date temp2 = new Date(t2.getYear(),t2.getMonth(),t2.getDate(),ab,0);
    
        Date sunday1;//晚于开始时间的最近的星期天
        Date sunday2;//早于结束时间的最近星期天
    
        sunday1 = new Date(temp1.getTime()+(7-temp1.getDay())*milsecPerDay);
        sunday2 = new Date(temp2.getTime()-temp2.getDay()*milsecPerDay);
    
        long weeks = (sunday2.getTime()-sunday1.getTime())/(milsecPerDay*7);
    
        int hour1 = 0;//第一周剩余的小时数
        int hour2 = 0;//最后一周剩余的小时数
        int hour3 = 0;//中间的小时数
    
        hour3 = (int) (weeks * hoursPerWeek);
    
        if(t1.getDay()==0||t1.getDay()==6){
            hour1 = hoursPerWeek;
        }else{
            hour1 += (5-t1.getDay())*hoursPerDay;
            hour1 += calculateHoursInOneDay(t1.getHours());
        }
        if(t2.getDay()==0){
            hour2 = 0;
        }else{
            hour2 += (t2.getDay()-1)*hoursPerDay;
            if(t2.getDay()!=6){
                hour2 += calculateHoursInOneDay2(t2.getHours());
            }
        }
        System.out.println(t1);
        System.out.println(t2);
        System.out.println(weeks);
        int hours = hour1 + hour2 + hour3;
        System.out.println(hours);
        return hours;
    }
    /**
     * 计算一天内的工作时间
     * @param hour 当天的时刻,开始时间
     * @return
     */
    private int calculateHoursInOneDay(int hour) {
        if(hour>=pe)
            return 0;
        if(hour>=pb)
            return pe-hour;
        if(hour>ae)
            return pe-pb;
        if(hour>ab)
            return ae-hour+pe-pb;
        return 0;
    }
    /**
     * 计算一天内的工作时间
     * @param hour 当天的时刻,结束时间
     * @return
     */
    private int calculateHoursInOneDay2(int hour) {
        if(hour>=pe)
            return hoursPerDay;
        if(hour>=pb)
            return ae-ab+hour-pb;
        if(hour>ae)
            return ae-ab;
        if(hour>ab)
            return hour-ab;
        return 0;
    }
    /**
     * 将字符串形式的时间转换成Date形式的时间
     * @param time
     * @return
     */
    private Date stringToDate(String time){
        SimpleDateFormat format = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); //这里的格式可以自己设置 
        try {
            return format.parse(time);
        } catch (ParseException e) {
            e.printStackTrace();
            return null;
        }
    }
    }

    这样应该可以了.

    2019-07-17 19:06:48
    赞同 展开评论
问答分类:
问答标签:
问答地址: