假定上班时间为2012-08-13 08:00:00,员工的班制为干12小时休24小时如何判断某个时间是否上班?例如:2012-08-13 03:50:00、2012-08-13 08:50:00、2012-08-13 21:50:00是否上班?谢谢!

解决方案 »

  1.   


    String s = "2012-08-13 08:00:00";
    String[] arr = new String[] { "2012-08-13 03:50:00", "2012-08-13 08:50:00", "2012-08-13 21:50:00" };
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    long d = sdf.parse(s).getTime();
    for (String a : arr) {
    long t = sdf.parse(a).getTime();
    long c = (t - d) / 1000 / 60 / 60;
    if (c >= 0 && c / 12 % 3 == 0 || c < 0 && c / 12 % 3 != 0) {
    System.out.println(a + " : 上班");
    } else {
    System.out.println(a + " : 休息");
    }
    }
      

  2.   


    是否假定 2012-08-13 08:00:00 是一个基准时间?也就是第一个12小时的起始时间?那么你的需求其实是 36 小时为一个周期,每个周期分为3段(12小时一段),利用所需判定时间与基准时间的差,可以非常快速判断出任何一个时间是否为工作时间。long baseTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2012-08-13 08:00:00").getTime(); // 基准时间的毫秒数
    long current = new Date().getTime(); // 当前时间毫秒数(可以替换成你需要判断的任何时间)long hour = (current - baseTime) / 1000 / 60 / 60; // 小时差
    int segment = (int) ((hour / 12) % 3); // 计算出所属时段那么: segment == 0 是上班时间;segment != 0 是休息时间。
      

  3.   

    for examplepublic static boolean isWorking(
        String checkStr, 
        String baseStr, 
        long workTime,
        long restTime) throws Exception {    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        long base = sdf.parse(baseStr).getTime();
        long target = sdf.parse(checkStr).getTime();    long mod = (target-base) % (workTime+restTime);
        if (mod < 0) mod += (workTime+restTime);
        return mod < workTime;
    }//test
    String base = "2012-08-13 08:00:00";
    String[] date = {"2012-08-13 03:50:00", "2012-08-13 08:50:00", "2012-08-13 21:50:00"};
    for (String s : date) {
        if (isWorking(s, base, 12*60*60*1000, 24*60*60*1000)) {
            System.out.printf("%s: work\n", s);
        } else {
            System.out.printf("%s: rest\n", s);
        }  
    }
      

  4.   

    你把7L的代码
     if (isWorking(s, base, 12*60*60*1000, 24*60*60*1000)) {
    改成
     if (isWorking(s, base, 24*60*60*1000, 48*60*60*1000)) {把时间字符串SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    改成SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");应该可以对应
      

  5.   

    如果用 6 楼的建议的话,是:
      int segment = (int) ((hour / 24) % 3); // 计算出所属时段,0则说明是上班时间。此外,你的上班时间,应该精确到小时,而非天;因为8月14日8点以前是上班时间而8点以后则不是。
      

  6.   

    7楼这代码我不大明白      long mod = (target-base) % (workTime+restTime);
        if (mod < 0) mod += (workTime+restTime);
        return mod < workTime;请问 怎么解释呢?