主要思路:

对于任意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;

public class DateCal {

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

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

}

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

public int getHolidays(Calendar d1,Calendar d2){
return this.getDaysBetween(d1, d2)-this.getWorkingDay(d1, d2);

}

}

计算任意2个日期内的工作日(没有考虑到国定假日相关推荐

  1. java计算任意2个日期内的工作日_计算任意2个日期内的工作日(摘抄)

    思路不错,对时间的操作挺全面,参考一下.代码如下: package test; import java.text.SimpleDateFormat; import java.util.Calendar ...

  2. Java判断工作日计算,计算随意2个日期内的工作日

    当前位置:我的异常网» Java Web开发 » 计算随意2个日期内的工作日 计算随意2个日期内的工作日 www.myexceptions.net  网友分享于:2013-08-17  浏览:51次 ...

  3. Python:用生成器的方式计算任意起止范围内质数的和。

    用生成器的方式计算任意起止范围内质数的和. (质数,又称素数,是大于 1 的自然数,除了 1 和它本身外,不能被其他自然数整除.) def judge(num):if num == 1:return ...

  4. php计算指定日期之间的天数,php计算任意两个日期之间的天数

    /* php计算任意两个日期之间的天数 基本思想,算术减法: cur_date         2009 04 11 last_date   - 2008 12 20 ---------------- ...

  5. oracle计算每月最小工作日,Oracle计算指定日期内的工作日(不包含周末)

    1.获取当天是礼拜几:select to_char(sysdate,'d') from dual; --礼拜天为1,礼拜一为2,类推 2.获取 两个时间段间的 工作日: select (trunc(& ...

  6. oracle取某年工作日,Oracle计算指定日期内的工作日(不包含周末)

    1.获取当天是礼拜几:select to_char(sysdate,'d') from dual; --礼拜天为1,礼拜一为2,类推 2.获取 两个时间段间的 工作日: select (trunc(& ...

  7. Oracle计算指定日期内的工作日(不包含周末)

    1.获取当天是礼拜几:select to_char(sysdate,'d') from dual; --礼拜天为1,礼拜一为2,类推 2.获取 两个时间段间的 工作日: select (trunc(& ...

  8. 计算任意两个日期之间的天数【附源码】

    题目:计算两个日期之间的天数 思路: 同年同月:之间两个天数相减即可,即(day1-day2-1)很简单. 同年不同月:先计算完整月数的天数,即从指定日期的写个月开始计算,计算每个月有多少天,都加起来 ...

  9. python获取工作日_Python获取一段日期内的工作日和所有日期

    Pandas 1.获取工作日:bdate_range import pandas as pd e = pd.bdate_range('8/7/2019', '8/31/2019') e.date #获 ...

  10. php做一个计算日期之间天数,PHP计算任意两个日期之间的天数

    PHP面试题中,关于日期的题目作为基础考题经常出现,下面讨论一下获取两个日期之间的天数的方法. 收到一个答案,拆分年.月.日,分别进行减法,然后统计天数,好累. 针对低版本的PHP可以用下面的方式搞定 ...

最新文章

  1. LAMP搭建phpMyadmin管理平台以及wordpress个人博客系统
  2. Linux下搭建高效的SVN
  3. Ubuntu 16 安装ElasticSearch
  4. RAC环境下的备份与恢复(二)
  5. Linux学习第五篇之文件处理命令touch、cat、tac、more、less、head、tail
  6. Oracle share server
  7. 揭秘丨7分钟看懂华为云鲲鹏Redis背后的自研技术
  8. M3 Build6801 Discovery support Virtual Hard Disks
  9. 计算机怎么打开网络共享,如何开启Window7的媒体流共享(开启电脑 DLNA 共享)...
  10. 2022 CCF国际AIOps挑战赛决赛暨AIOps研讨会成功举办
  11. P1540 机器翻译洛谷题解
  12. 蓝桥杯_单片机_入门基础知识(七)_DS18b20
  13. 糖醋鲤鱼——经典美食
  14. 计算机表演赛所选赛区,第十六届全国中小学学生计算机表演赛邢台赛区评选结果.doc...
  15. python线性回归预测pm2.5_李宏毅 线性回归预测PM2.5
  16. onbeforeunload, 浏览器关闭和刷新提示
  17. [转载]考研还是就业
  18. 时空之巅服务器在线玩,天域之巅 - 《神鬼传奇》官方网站
  19. 团队-团队编程项目作业名称-团队信息
  20. 微信小程序开发类似微博回复功能自带云开发数据库(无限回复)

热门文章

  1. 什么是南桥芯片和北桥芯片?南桥芯片和北桥芯片区别
  2. 什么是服务器?服务器是用来做什么的?
  3. Unity 通过代码修改材质球属性
  4. ceph rbd mysql_ceph-rbd使用
  5. python arp断网攻击_arp断网攻击,手把手教你arp断网攻击怎么解决
  6. 机动车尾气排放智能抓拍解决应用方案
  7. Android Behavior
  8. 【OCP】小麦苗OCP(包括11g、12c、18c、19c等)网络班早已开讲,注重实践,报名一次,终身可免费升级学习,推荐有红包...
  9. 【参赛作品22】华为openGauss数据库行存储源代码解析
  10. java整理快捷鍵_常用Eclipse快捷键整理