`
namelessmyth
  • 浏览: 21372 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
文章分类
社区版块
存档分类
最新评论

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

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics