`
qinya06
  • 浏览: 582241 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

阅读更多
主要思路: 对于任意2个日期比如:date_start=2010-8-1、date_end=2010-9-5 ,首先计算这连个日期之间的时间间隔(天数),然后分别对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);
   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);
   // 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);
  }
  }
分享到:
评论

相关推荐

    java工具类:Java中计算任意两个日期之间的工作天数.java

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

    计算任意两年之间的间隔天数的java代码

    计算任意两年之间的间隔天数的java代码,可以自己输入任意的年月日。

    java实现输入任意两个日期输出月份数和天数

    java实现输入任意两个日期输出月份数和天数,综合考虑闰年、2月等因素,对于整月计算利息或按天数计算利息提供基础工具类。也可以吧内部类独立出来,方便跨包调用,可自行调整。很实用的一个实现。其他百度查到的很...

    用JAVA编写的计算天数的程序,例如从你出生到今天已经多少天了

    用JAVA编写的计算天数的程序,例如从你出生到今天已经多少天了。可以任意的输入两个日期,计算其中间的天数

    datediff:Java编码练习,用于计算任何两个日期之间的天数,而无需将Java库类用于日期或日历。 这是一个有趣的练习

    编码练习计算任意两个日期之间的天数差异jesimone57,2017年6月6日描述创建一个可以按以下格式成对读取日期的应用程序:DD MM YYYY, DD MM YYYY验证输入数据,并计算两个日期之间的天数之差。 应用程序的输出应采用...

    常用的java工具类

    2.[工具类] Java中计算任意两个日期之间的工作天数 .java 3.[工具类] MD5 .java 4.[工具类] 时间工具TimeUtil.java 5.[工具类] 通信服务端simpleServer 6.[工具类] 使用Java程序来实现HTTP文件的队列下载 .java 7....

    30个java工具类

    [工具类] Java中计算任意两个日期之间的工作天数 .java.txt [工具类] java抓取网页 .java.txt [工具类] MD5 .java.txt [工具类] MD5强化版 .java.txt [工具类] MD5超强化版 .java.txt [工具类] XML 实用工具类 .java...

    日期处理技术。1、对于任意三个整数,判断其是否为一个合法的日期值。

    1、对于任意三个整数,判断其是否为一个合法的日期值。 2、给定一个日期值,计算若干天后的日期值。 3、如果有两个日期值,计算它们相距的天数。

    日期处理技术 java

    1.对于任意三个整数,判断其否为一个合法的日期值. 2.给定一个日期值,计算若干天后的日期值. 3.如果有两个日期值,计算它们相距的天数.

    【强2】30个java工具类

    [工具类] Java中计算任意两个日期之间的工作天数 .java.txt [工具类] java抓取网页 .java.txt [工具类] MD5 .java.txt [工具类] MD5强化版 .java.txt [工具类] MD5超强化版 .java.txt [工具类] XML 实用工具类 .java...

    jaava和jsp工具类

    [工具类] 成各种密码随机串,加密解密,编码解码,执行url.java [工具类] 读取、打印输出、保存xml .java ...[工具类] Java中计算任意两个日期之间的工作天数 .java [工具类] java抓取网页 .java [工具类] MD5 .java

    编写Java程序随机输入日期计算星期几,打印任意一年的日历

    随机输入日期计算星期几,打印任意一年的日历 已知,1900年1月1日是星期1,用户随机输入年月日,计算星期几 实现思路: 一、知道1900年1月1日为星期一,求输入的年份月份与1900年1月1日相隔的总天数。闰年366天,...

    JAVA面试题最全集

    如何获取某个日期是当月的最后一天 如何格式化日期 5.数组和集合 6.文件和目录(I/O)操作 如何列出某个目录下的所有文件 如何列出某个目录下的所有子目录 判断一个文件或目录是否存在 如何读写文件 7.Java...

    java范例开发大全源代码

     实例26 存上100元需要多少天 40  实例27 输出100之间的所有偶数 41  实例28 如何判断回文数字 42  3.4 do…while语句 43  实例29 输出100之间的所有奇数 44  实例30 求最大的随机数 44  3.5 ...

    java范例开发大全

    实例26 存上100元需要多少天 40 实例27 输出100之间的所有偶数 41 实例28 如何判断回文数字 42 3.4 do…while语句 43 实例29 输出100之间的所有奇数 44 实例30 求最大的随机数 44 3.5 switch语句 45 实例31 判断字母...

    Java范例开发大全 (源程序)

     实例26 存上100元需要多少天 40  实例27 输出100之间的所有偶数 41  实例28 如何判断回文数字 42  3.4 do…while语句 43  实例29 输出100之间的所有奇数 44  实例30 求最大的随机数 44  3.5 switch...

    Java范例开发大全(全书源程序)

    实例26 存上100元需要多少天 40 实例27 输出100之间的所有偶数 41 实例28 如何判断回文数字 42 3.4 do…while语句 43 实例29 输出100之间的所有奇数 44 实例30 求最大的随机数 44 3.5 switch语句 45 实例31 ...

    java范例开发大全(pdf&源码)

    实例26 存上100元需要多少天 40 实例27 输出100之间的所有偶数 41 实例28 如何判断回文数字 42 3.4 do…while语句 43 实例29 输出100之间的所有奇数 44 实例30 求最大的随机数 44 3.5 switch语句 45 实例31 判断字母...

    dijkstra:先开最短路径

    (3) 使用 Dijkstra 算法找到图中任意两个顶点之间的最短路径。 (4) 打印图形。 (5) 找出图中所有节点的可达顶点集。 程序设计 附带的 java 项目包含以下文件。 1. Graph.java 2. WeightedGraph.java 3. Vertex....

    Java复习题

    三、 编写程序,从键盘输入一个0~99999之间的任意数,判断输入的数是几位数? 四、 编写程序,给定一个学生成绩,给出相应等级: 90~100优秀80~89良好70~79中等60~69及格0~59不及格 ...... 七、 猴子吃桃问题。猴子...

Global site tag (gtag.js) - Google Analytics