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

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());

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值