旋转的钢笔 2015-08-26 08:26 采纳率: 54.5%
浏览 4730
已采纳

java中时间间隔小时计算

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

  • 写回答

6条回答 默认 最新

  • jiajia333666 2015-08-27 12:25
    关注

    之前的代码确实有问题,现在做了修改。
    package aaa;

    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;
        }
    }
    

    }
    这样应该可以了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器