Java中计算任意两个日期之间的工作天数

2016-02-19 20:04 30 1 收藏

下面,图老师小编带您去了解一下Java中计算任意两个日期之间的工作天数,生活就是不断的发现新事物,get新技能~

【 tulaoshi.com - 编程语言 】

  主要思路: 对于任意2个日期比如:date_start=2006-10-1、date_end=2006-10-14 ,首先计算这连个日期之间的时间间隔(天数),然后分别对date_start 和date_end 取得它们下一个星期一的日期,这样就可以得到一个新的可以整除7的完整日期间隔(这个新的日期间隔已经把星期几的问题剔出掉了),换一种说法就是我们可以得到,这两个新的日期之间的周数,拿这个周数乘以5就是工作日期了(tmpWorkingDays)。但是这个日期并不是我们所要的日期,接下来我们要做的就是计算date_start,date_end这两个日期对于根据它们所产生的新的日期之间的时间偏移量,date_start的偏移量(date_start_change)是需要加的,而date_end的这个偏移量(date_end_change)是需要减去的。 最后我们只要用tmpWorkingDays+date_start_change-date_end_change就是我们所要求的实际工作日了。以下是所有实现代码(两个日期跨年也没有问题)。

  package com.date.utlit;

  import Java.text.SimpleDateFormat;
  import java.util.Calendar;
  import java.util.Date;
  import java.util.GregorianCalendar;
  /**
   * 计算任意2个日期内的工作日(没有考虑到国定假日)
   * @author user
   *
   */
  public class DateCal {

   /**
    * @param args
    */
   public static void main(String[] args) {
    try {

     String strDateStart = "2006-10-1";
     String strDateEnd = "2006-10-14";
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
     Date date_start = sdf.parse(strDateStart);
     Date date_end = sdf.parse(strDateEnd);
     DateCal app = new DateCal();
     Calendar cal_start = Calendar.getInstance();
     Calendar cal_end = Calendar.getInstance();
     cal_start.setTime(date_start);
     cal_end.setTime(date_end);
     System.out.println("星期--" + app.getChineseWeek(cal_start)
       + " 日期--" + cal_start.get(Calendar.YEAR) + "-"
       + (cal_start.get(Calendar.MONTH) + 1) + "-"
       + cal_start.get(Calendar.DAY_OF_MONTH));
     System.out.println("星期--" + app.getChineseWeek(cal_end) + " 日期--"
       + cal_end.get(Calendar.YEAR) + "-"
       + (cal_end.get(Calendar.MONTH) + 1) + "-"
       + cal_end.get(Calendar.DAY_OF_MONTH));
     System.out.println("工作日为--"
       + app.getWorkingDay(cal_start, cal_end));
     System.out.println("休息日--"+app.getHolidays(cal_start, cal_end));
    } catch (Exception e) {
     // TODO: handle exception
    }
   }

   public int getDaysBetween(java.util.Calendar d1, java.util.Calendar d2) {
    if (d1.after(d2)) { // swap dates so that d1 is start and d2 is end
     java.util.Calendar swap = d1;
     d1 = d2;
     d2 = swap;
    }
    int days = d2.get(java.util.Calendar.DAY_OF_YEAR)
      - d1.get(java.util.Calendar.DAY_OF_YEAR);
    int y2 = d2.get(java.util.Calendar.YEAR);
    if (d1.get(java.util.Calendar.YEAR) != y2) {
     d1 = (java.util.Calendar) d1.clone();
     do {
  
       days += d1.getActualMaximum(java.util.Calendar.DAY_OF_YEAR);
      d1.add(java.util.Calendar.YEAR, 1);
     } while (d1.get(java.util.Calendar.YEAR) != y2);
    }
    return days;
   }

   /**
    * 计算2个日期之间的相隔天数
    * @param d1
    * @param d2
    * @return
    */
   public int getWorkingDay(java.util.Calendar d1, java.util.Calendar d2) {
    int result = -1;
    if (d1.after(d2)) { // swap dates so that d1 is start and d2 is end
     java.util.Calendar swap = d1;
     d1 = d2;
     d2 = swap;
    }

    int betweendays = getDaysBetween(d1, d2);

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  
    int charge_date = 0;
    int charge_start_date = 0;//开始日期的日期偏移量
    int charge_end_date = 0;//结束日期的日期偏移量
     // 日期不在同一个日期内
     int stmp;
     int etmp;
     stmp = 7 - d1.get(Calendar.DAY_OF_WEEK);
     etmp = 7 - d2.get(Calendar.DAY_OF_WEEK);
     if (stmp != 0 && stmp != 6) {// 开始日期为星期六和星期日时偏移量为0
      charge_start_date = stmp - 1;
     }
     if (etmp != 0 && etmp != 6) {// 结束日期为星期六和星期日时偏移量为0
      charge_end_date = etmp - 1;
     }
  //  }
    result = (getDaysBetween(this.getNextMonday(d1), this.getNextMonday(d2)) / 7)
      * 5 + charge_start_date - charge_end_date;
    //System.out.println("charge_start_date" + charge_start_date);
    //System.out.println("charge_end_date" + charge_end_date);
    //System.out.println("between day is--" + betweendays);
    return result;
   }

   public String getChineseWeek(Calendar date) {
    final String dayNames[] = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五",
      "星期六" };

    int dayOfWeek = date.get(Calendar.DAY_OF_WEEK);

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

    // System.out.println(dayNames[dayOfWeek - 1]);
    return dayNames[dayOfWeek - 1];

   }

   /**
    * 获得日期的下一个星期一的日期
    *
    * @param date
    * @return
    */
   public Calendar getNextMonday(Calendar date) {
    Calendar result = null;
    result = date;
    do {
     result = (Calendar) result.clone();
     result.add(Calendar.DATE, 1);
    } while (result.get(Calendar.DAY_OF_WEEK) != 2);
    return result;
   }
   
   /**
    *
    * @param d1
    * @param d2
    * @return
    */
   public int getHolidays(Calendar d1,Calendar d2){
    return this.getDaysBetween(d1, d2)-this.getWorkingDay(d1, d2);
   }
  }


来源:https://www.tulaoshi.com/n/20160219/1622669.html

延伸阅读
标签: PHP
  //在PHP中处理日期非常不方便,比如求两个日期之间相差的月份?该怎么办呢?  //文件名:date.inc.php3  //在使用这两个函数前,要先将日期或日期时间转换成timestamp类型。  //如:  //$today=mktime(0,0,0,date("m"),date("d"),date("Y"));  /****模拟sqlserver中的dateadd...
标签: 怀孕
每一位即将做母亲的女性都迫切想要了解怀孕多长时间分娩这个问题,分娩具体的测试方法可以按照怀孕末次月经或妊娠早期的一些妇科检查来进行计算。预产期,即孕妇预计生产的日期,不是精确的分娩日期,由于每一位孕妇都难权准确地判断受孕的时间,所以,医学上规定,以怀孕末次月经的第一次起计算预产期,其整个孕期共280天,10个妊娠月。怀孕期...
《模拟城市5》两个城市之间的连接方法 两个城市之间的连接方法: 城市详细上有具体标注水路和铁路。 铁路链接按实际连接的城市为主。 水路有河流分区,不同区的也不通。 只有飞机场是全区域联通的。 阅读延伸: 《模拟城市5》2.0补丁将至 仍然无法离线 《模拟城市5》被破解 盗版体验竟优于正版 《模拟城市5》新版PC最低配置需求...
标签: Web开发
打包下载 自己写了一个很简单的jquery插件,在页面中调用其中的函数就可实现. 插件源代码(listtolist.js): 代码如下: /** fromid:源list的id. toid:目标list的id. moveOrAppend参数("move"或者是"append"): move -- 源list中选中的option会删除.源list中选中的option移动到目标list中,若目标list中已存在则该option不添加. append --...
下面图老师小编教大家两个瑜伽动作可以有效的缓解工作压力的呦 1、脊柱转动式 坐姿,两腿并拢向前伸直。 吸气,将一侧腿收回,脚掌放在另一侧膝盖外的地面上。手扶脚踝。保持脊柱自然伸展。 呼气,另一侧手轻扶臀部后侧地面,略微推动,使脊柱向后拧转。眼睛尽量看向身体后侧,控制姿势...

经验教程

341

收藏

95
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部