`
namelessmyth
  • 浏览: 21450 次
  • 性别: 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());
    }
    
}

 

 

 

分享到:
评论

相关推荐

    JAVA时间工具类(计算法定工作日工时等)

    JAVA时间工具类(计算法定工作日工时):计算某个日期加上几个工作日后的一个工作日期(除周末和法定节假日),计算某个日期后一天的工作日期(除周末和法定节假日),计算两个日期的真实工作日(除周末和法定节假日),...

    java 工具类 获取俩个时间之间相差分钟数 排除周六周日 节假日 精确到分钟数/秒

    网上排除节假日、周六周日 获取相差时间 分为四种情况, 精确到天 此工具类在此基础之上进行优化, 分为俩种情况, 精确到分钟,保留俩位小数 (精确到秒 需自己加工下) 入口方法: getWorkHours

    Java 工作日计算

    //计算15个工作日之后的工作日日期 Date date = workdayUtils.getWorkday(new Date(), 15); //计算两个日期之间的工作日总数 int count = workdayUtils.getWorkdayCount(new Date(), format.parse("2013-08-13"));

    java计算整年工作日(包含特殊的工作日)排除法定节假日和周末能运行

    java计算整年工作日(包含特殊的工作日)排除法定节假日和周末能运行

    java中计算某个月的工作日总共几天

    在Java中,要计算一个月内有多少个工作日(通常指周一至周五),以及具体哪些日子是工作日,可以通过多种方法实现。这里将介绍一种较为通用的方法:利用`java.util.Calendar`类来计算指定月份内的工作日。 #### 一...

    java工作日计算(去除法定假日)

    通过以上步骤,我们可以构建一个功能完善的工作日计算系统,能够精确地计算出两个日期之间的工作日数量,同时考虑到了法定节假日的影响。这个过程涉及了文件读取、日期时间处理和自定义逻辑的实现,是Java开发中的一...

    2023年日历(标记工作日,节假日,调休,周末),计算两个日期相差的工作日天数

    压缩包里有2个文件,用于计算两个日期相差的工作日天数(排除周末和法定节假日): 1、excel表为2023年日历数据,并且备注工作日、周末,调休、节假日类型,可导入数据库。 2、SQL文件为2023年所有日期的插入SQL,并...

    java 周算法 通过日期得到周信息

    本文将详细介绍一个Java程序中的实用工具类——`WeekUtil`,该类主要用于处理与周相关的各种计算问题,如确定某个日期所在的周数、获取指定周的第一天和最后一天等。这对于需要根据日期进行周统计的应用场景非常有用...

    2022年日期类型(工作日,节假日,周末,节假日调休)

    1、excel表数据为2022年周末休息日和法定节假日数据,并且备注周末和节假日类型,可导入数据库,用于计算两个日期相差的工作日天数(排除周末和法定节假日)。 2、SQL文件为2022年所有日期,并标注:工作日、法定节...

    android java日期计算工具

    android java日期计算工具

    Java节假日算法(免费)

    首先,DateToDate 类中有一个静态方法 getContainVacation,该方法的作用是计算在给定的日期范围内包含假期的天数。如果在这个日期范围内不包含假期,则返回 0。这个方法的实现过程是通过遍历假期列表,检查每个假期...

    java swing 时间日期选择控件

    2. **JDatePicker**: 这是SwingX库中的一个组件,它提供了一个简单的日期选择界面,包括一个日期模型和一个可定制的日期格式器。用户可以点击一个文本框旁边的图标来打开日期选择对话框,选择日期后,文本框会自动...

    JAVA生成订单号(日期+流水号)

    通过上述步骤,我们可以在Java中实现一个基于日期和流水号的订单号生成器。对于提供的`java订单号(时间加流水号).txt`文件,可能包含了具体的代码实现或使用示例,你可以查阅该文件以获取更详细的实现细节。在实际...

    java实现两个时间相差的年月日 (相差几年几天几日的结果)

    网上很多资源都没有输出结果是(相差几年几个月几天的代码)希望对大家有帮助 有不足地方 望大家多多指点

    java自动生成节假日对照表

    在Java编程中,生成节假日对照表是一个常见的需求,特别是在开发涉及日期处理和日程安排的应用时。中国的节假日安排并非完全遵循公历,因此单纯依赖阳历计算并不准确。例如,春节、中秋节等传统节日以及国庆节、劳动...

    java 微积分计算 一个小程序 有兴趣可以看一下

    5. **用户交互界面**:为了使用户能够方便地输入函数并查看结果,程序通常会提供一个简单的命令行界面或者图形用户界面(GUI)。用户可以通过输入函数表达式和指定积分范围,程序会显示计算结果。 6. **错误处理**...

    java编写的日历类程序,输入年份和月份,打印出该月的日历

    - **`Calendar` 类**:Java标准库中的一个实用类,用于处理日期和时间相关的操作。 - **`Scanner` 类**:用于从标准输入流读取数据,便于用户交互。 #### 3. 程序结构分析 - **主函数 `main`**:程序的入口,负责...

    java源码包---java 源码 大量 实例

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    Java FTP 指定下载文件和上传文件到指定的服务器目录

    ### Java FTP 指定下载文件和上传文件到指定的服务器目录 #### 一、概述 在本篇文章中,我们将详细介绍如何使用Java编程语言通过FTP(文件传输协议)实现文件的上传与下载功能,并能够将文件指定上传或下载到特定...

    全国计算机二级java题库

    考试内容: 一、 Java语言的特点和实现机制 二、 Java体系结构 1. JDK目录结构。 2. Java的API结构。 3. 开发环境设置。 4. Java程序结构。 三、 Java语言中面向对象的特性。 1. 面向对象编程的基本要领和特征。 2. ...

Global site tag (gtag.js) - Google Analytics