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 <Calendar> 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()); } }
- oracle计算一个日期加上指定工作日(排除周六周日和一系列节假日)时间
- Java计算加上指定工作日数(排除周六周日和一系列节日)
- oracle计算一个日期加上指定工作日(排除周六周日和一系列节假日)时间
- java计算两个日期之前的天数(工作日),排除节假日和周末
- Java 日期格式加上指定月数(一个期限)得到一个新日期的实现代码
- java的一个日期格式加上指定月数,得到一个新日期(此方法通用)
- Java模块 -- 计算工作日 (Excel导入法定假日至数据库 排除周六 周日 法定假日) Calendar
- Java 给定一个指定日期 加上天数 输出加上天数的日期
- Java 给定一个指定日期 加上天数 输出加上天数的日期
- java 求两个日期间的工作日(无周六日)
- JAVA得到一个指定日期范围内每天的开始时间和结束时间
- java根据两个日期计算每月的天数,并且除去周六日
- java 根据开始日期 ,需要的工作日天数 ,计算工作截止日期,并返回截止日期
- java通过传入一个指定日期获取该日期所在周的周一的日期,日期格式如:2016-07-30
- java指定日期加上天数
- 【java基础】随手写的一个日期计算,新手可以看看
- java8 利用java7的date 做一个开始日期到结束日期 计算中间一共隔了多少日期
- java通过输入工作日数(正或负)得到具体日期或计算两个日期之间的工作日
- java计算两个日期之前的天数实例(排除节假日和周末)
- 从键盘输入一个日期,格式为yyyy-M-d 要求计算该日期与1949年10月1日距离多少天(java)