Java:计算一个日期加上指定工作日数(排除周六周日和一系列节日)

工作时遇到的,随便写了个,欢迎高手点评:

核心代码:

package www.sjjjob.com.date;

import java.util.ArrayList;

import java.util.Calendar;

import java.util.List;

/**

* 日期公共函数

* @author  shenjunjie

* @version  [s001, 2010-11-19]

*

* public static final int DAY_OF_WEEK_IN_MONTHget 和 set 的字段数字,指示当前月中的第几个星期。

* 与 DAY_OF_WEEK 字段一起使用时,就可以唯一地指定某月中的某一天。

* 与 WEEK_OF_MONTH 和 WEEK_OF_YEAR 不同,

* 该字段的值并不 取决于 getFirstDayOfWeek() 或 getMinimalDaysInFirstWeek()。

* DAY_OF_MONTH 1 到 7 总是对应于 DAY_OF_WEEK_IN_MONTH 1;8 到 14 总是对应于 DAY_OF_WEEK_IN_MONTH 2,

* 依此类推。DAY_OF_WEEK_IN_MONTH 0 表示 DAY_OF_WEEK_IN_MONTH 1 之前的那个星期。

* 负值是从一个月的末尾开始逆向计数,因此,一个月的最后一个星期天被指定为 DAY_OF_WEEK = SUNDAY,

* DAY_OF_WEEK_IN_MONTH = -1。因为负值是逆向计数的,所以它们在月份中的对齐方式通常与正值的不同。

* 例如,如果一个月有 31 天,那么 DAY_OF_WEEK_IN_MONTH -1 将与 DAY_OF_WEEK_IN_MONTH 5

* 和 DAY_OF_WEEK_IN_MONTH 4 的末尾相重叠。

*/

public class DateUtil

{

private static List holidayList;

private static boolean holidayFlag;

/**

* 计算工作日

* 具体节日包含哪些,可以在HolidayMap中修改

* @param src 日期(源)

* @param adddays 要加的天数

* @exception throws [违例类型] [违例说明]

* @version  [s001, 2010-11-19]

* @author  shenjunjie

*/

public static Calendar addDateByWorkDay(Calendar src,int adddays)

{

//        Calendar result = null;

holidayFlag = false;

for (int i = 0; i < adddays; i++)

{

//把源日期加一天

src.add(Calendar.DAY_OF_MONTH, 1);

holidayFlag =checkHoliday(src);

if(holidayFlag)

{

i--;

}

System.out.println(src.getTime());

}

System.out.println("Final Result:"+src.getTime());

return src;

}

/**

* 校验指定的日期是否在节日列表中

* 具体节日包含哪些,可以在HolidayMap中修改

* @param src 要校验的日期(源)

* @version  [s001, 2010-11-19]

* @author  shenjunjie

*/

public static boolean checkHoliday(Calendar src)

{

boolean result = false;

if (holidayList == null)

{

initHolidayList();

}

//先检查是否是周六周日(有些国家是周五周六)

if (src.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY

|| src.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY)

{

return true;

}

for (Calendar c : holidayList)

{

if (src.get(Calendar.MONTH) == c.get(Calendar.MONTH)

&& src.get(Calendar.DAY_OF_MONTH) == c.get(Calendar.DAY_OF_MONTH))

{

result = true;

}

}

return result;

}

/**

* 初始化节日List,如果需要加入新的节日,请在这里添加

* 加的时候请尽量使用Calendar自带的常量而不是魔鬼数字

* 注:年份可以随便写,因为比的时候只比月份和天

* @version  [s001, 2010-11-19]

* @author  shenjunjie

*/

private static void initHolidayList()

{

holidayList = new ArrayList();

//五一劳动节

Calendar may1 = Calendar.getInstance();

may1.set(Calendar.MONTH,Calendar.MAY);

may1.set(Calendar.DAY_OF_MONTH,1);

holidayList.add(may1);

Calendar may2 = Calendar.getInstance();

may2.set(Calendar.MONTH,Calendar.MAY);

may2.set(Calendar.DAY_OF_MONTH,2);

holidayList.add(may2);

Calendar may3 = Calendar.getInstance();

may3.set(Calendar.MONTH,Calendar.MAY);

may3.set(Calendar.DAY_OF_MONTH,3);

holidayList.add(may3);

Calendar h3 = Calendar.getInstance();

h3.set(2000, 1, 1);

holidayList.add(h3);

Calendar h4 = Calendar.getInstance();

h4.set(2000, 12, 25);

holidayList.add(h4);

//中国母亲节:五月的第二个星期日

Calendar may5 = Calendar.getInstance();

//设置月份为5月

may5.set(Calendar.MONTH,Calendar.MAY);

//设置星期:第2个星期

may5.set(Calendar.DAY_OF_WEEK_IN_MONTH,2);

//星期日

may5.set(Calendar.DAY_OF_WEEK,Calendar.SUNDAY);

//        System.out.println(may5.getTime());

holidayList.add(may5);

}

}

下面是JUnit4的测试代码:

package www.sjjjob.com.date;

import java.util.Calendar;

import junit.framework.Assert;

import org.junit.After;

import org.junit.AfterClass;

import org.junit.Before;

import org.junit.BeforeClass;

import org.junit.Test;

public class DateUtilTest

{

@Test

public void testAddDateByWorkDay()

{

Calendar src = Calendar.getInstance();

src.set(2010, Calendar.APRIL , 29);

Calendar result = DateUtil.addDateByWorkDay(src, 2);

Calendar expected = Calendar.getInstance();

expected.set(2010, Calendar.MAY , 4);

Assert.assertEquals(expected.getTime().toString(), result.getTime().toString());

}

@Test

public void testAddDateByWorkDay2()

{

//测试母亲节

Calendar src = Calendar.getInstance();

src.set(2010, Calendar.MAY , 7);

Calendar result = DateUtil.addDateByWorkDay(src, 2);

Calendar expected = Calendar.getInstance();

expected.set(2010, Calendar.MAY , 11);

Assert.assertEquals(expected.getTime().toString(), result.getTime().toString());

}

}

java 算出下一个工作日,Java:计算一个日期加下指定工作日数(排除周六周日和一系列节日)...相关推荐

  1. oracle计算一个日期加上指定工作日(排除周六周日和一系列节假日)时间

    第一步: 创建一个表格holiday用于灵活存放节假日日期(周末除外),如果和周末日期重复,则无需添加到该表格中: create table T_RENT_HOLIDAY ( ID VARCHAR2( ...

  2. java 算出下一个工作日_Java 计算一段时间段内除去周六日、节假日的工作日数———超详细(全)...

    Java 计算一段时间段内除去周六日.节假日的工作日数'' 实现功能提要: 本文章记录的是某段时间的起止时间段内的工作日,既是除去周六周日以及节假日日期的工作日数: 注释比较多,因为怕自己忘记,写的可 ...

  3. Java黑皮书课后题第6章:*6.2(求一个整数各位数字之和)编写一个方法,计算一个整数各位数字之和。使用下面的方法头:public static int sumDigits(long n)

    6.2(求一个整数各位数字之和)编写一个方法,计算一个整数各位数字之和.使用下面的方法头:public static int sumDigits(long n) 题目 题目概述 槽点 代码 运行示例 ...

  4. 设计一个类代表二维空间的一个点,设计一个类代表二维空间的一个圆。要求两个成员变量。一个是圆心,一 个是半径,提供计算面积的方法。为上述Cricle类添加一个方法,计算一个点(Point)是否在圆内

    (1) 设计一个类代表二维空间的一个点 (2) 设计一个类代表二维空间的一个圆.要求两个成员变量.一个是圆心,一 个是半径,提供计算面积的方法. (3) 为上述Cricle类添加一个方法,计算一个点( ...

  5. 写一个函数,计算一个整数数组的平均值

    写一个函数,计算一个整数数组的平均值 public static void main(String[] args){//定义一个数组int[] array=new int[];//通过循环对数组赋值f ...

  6. js获取日期周数,并根据周数算出当前周的开始和结束日期(周日开始,周六结束)

    js获取日期周数,并根据周数算出当前周的开始和结束日期(周日开始,周六结束) 日历图片 代码 获取日期的周数(全年的第几周) 根据周数获取该周的开始日期(周日)和结束日期(周六) 日历图片 代码 获取 ...

  7. java中怎么通过日期算出天数_Java如何通过计算两个日期的时间差来算出天数

    Java如何通过计算两个日期的时间差来算出天数,年月日,天数,时间,退房,时分 Java如何通过计算两个日期的时间差来算出天数 易采站长站,站长之家为您整理了Java如何通过计算两个日期的时间差来算出 ...

  8. Java模块 -- 计算工作日 (Excel导入法定假日至数据库 排除周六 周日 法定假日) Calendar

    有一个小功能,要求是按照指定时间,计算出规定的工作日,排除国家法定节假日,周日,周六... 网上找了一些案例,但都算不准,但是它们的思路和方法可以借鉴下...于是一边想,一边改...就出来了.... ...

  9. 如何用Java算出100的阶乘

    今天小编突发奇想,一般的C语言和普通的计算器想要算出100的阶乘根本行不通,那么100的阶乘到底多大呢?想到Java中有个BigInteger类,于是,今天就用代码实现一下100的阶乘: import ...

最新文章

  1. 如何变得井井有条-来之不易的秘诀来组织您的生活
  2. BlackBerry 应用程序开发者指南 第一卷:基础--第9章 IT策略(Policy)
  3. arp协议属于哪一层_ARP的攻击与防御
  4. UltraISO 制作U盘启动盘(Ubuntu、CentOS)
  5. java web 密码加密_JavaWeb日记——Shiro之密码加密
  6. 为什么要进行TracePro模拟?
  7. Foxit PDF SDK For Windows 完美Patch Foxit PDF SDK
  8. Rplidar A1/A2使用及Hector_SLAM建图
  9. codesys 简单案例_CODESYS在智能生产线中的应用案例
  10. Java--集合框架--Map集合、 HashMap和Hashtable的区别、 Collections(集合工具类)
  11. 十大报表工具 BI 产品深度点评-----BI报表行业专家干货分享----一文读懂报表与BI的行业现状----最新常用BI报表工具对比科普帖
  12. 【疑难解决】H265编码流媒体播放器EasyPlayer.js播放HLS H265视频流,遇到黑屏如何排查?
  13. C#XML序列化特性全中文教程
  14. 国产最强?室友用了直呼牛逼
  15. PXE-启动错误代码
  16. 计算机一级网址打不开怎么办,电脑唯独一个网址打不开怎么解决
  17. 自然语言处理(NLP)—分词-—word2vec
  18. Mysql添加新用户设置密码
  19. 湍流的特点是什么?雷诺数的物理阐释?
  20. Notes Fifth Day-渗透攻击-红队-信息收集

热门文章

  1. MFC工作笔记0002---MFC HelloWorld程序
  2. linux查询配置基础命令,Linux查看系统配置常用命令
  3. 一步一步写算法(之基数排序)
  4. java定时运行一个url_Swift 4:如何异步使用URLSessionDataTask但请求是否在一个定时队列中?...
  5. Altium Designer画元器件封装三种方法
  6. lua和unity如何交互_(XLua)C#与Lua中的交互
  7. 点歌台 PHP,MeMusic3.0 PHP在线点歌系统 - 下载 - 搜珍网
  8. python 列表 remove()函数使用详解
  9. SQL server 增删改查语句
  10. sql server 日志清理语句