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

本文介绍了一个实用的日期处理工具类,该类提供了一系列方法用于计算工作日、获取特定日期如周五等,并包含了判断假期的功能。通过示例展示了如何进行日期的增减操作以及特殊日期的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.stocks.util;

import android.util.SparseArray;

import org.joda.time.DateTime;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;

public class DateUtil {
   private boolean holidayFlag;

//   int[][] holidays = {{6, 9}, {6, 10}, {9, 15}, {9, 16}};

   HashMap<Integer, List<Integer>> holidays;

   public void getHolidays() {
//      List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
      if (holidays == null) {
         holidays = new HashMap<>();
         holidays.put(6, Arrays.asList(9, 10));
         holidays.put(9, Arrays.asList(15, 16));
         holidays.put(1, Arrays.asList(1));
      }
   }

   /**
    * 计算工作日, 具体节日包含哪些,可以在HolidayMap中修改
    * src =日期(源), adddays 要加的天数
    */
   public 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;
   }

   public String getToday( String format){
      if (format == null) {
         format = "yyyyMMdd";
      }
      DateTime dateTime =new DateTime();
      boolean holidayFlag = true;
      int addday=0;
      while (holidayFlag) {
         //把源日期加一天
         holidayFlag = checkHolidayJoda(dateTime);
         if (holidayFlag) {
            dateTime = dateTime.plusDays(-1);
            addday++;
         }
      }
      if(addday==0 && dateTime.getHourOfDay()<8){
         dateTime=dateTime.plusDays(-1);
      }
      String strdate = dateTime.toString(format);
      return strdate;
   }
   public Integer getToday_old(Calendar src, String format) {


      if (format == null) {
         format = "yyyyMMdd";
      }
      boolean holidayFlag = true;
      while (holidayFlag) {
         //把源日期加一天
         holidayFlag = checkHoliday(src);
         if (holidayFlag) src.add(Calendar.DAY_OF_MONTH, -1);
      }
      Date dNow = src.getTime();
      SimpleDateFormat sdf = new SimpleDateFormat(format); //设置时间格式
      String defaultStartDate = sdf.format(dNow); //格式化前3月的时间
      return Integer.parseInt(defaultStartDate);
//   System.out.println("生成的时间是:" + defaultEndDate);
   }

   public int beforeDateByWorkDay(Calendar src, int beforedays, String format) {
      if (format == null) {
         format = ("yyyyMMdd");
      }
//        Calendar result = null;
      boolean holidayFlag = true;
      while (holidayFlag) {
         //把源日期加一天
         holidayFlag = checkHoliday(src);
         if (holidayFlag) src.add(Calendar.DAY_OF_MONTH, -1);
      }
      for (int i = 0; i < beforedays; i++) {
         //把源日期加一天
         src.add(Calendar.DAY_OF_MONTH, -1);
         holidayFlag = true;
         while (holidayFlag) {
            //把源日期加一天
            holidayFlag = checkHoliday(src);
            if (holidayFlag) src.add(Calendar.DAY_OF_MONTH, -1);
         }
         System.out.println(src.getTime());
      }
      System.out.println("Final Result:" + src.getTime());
      Date dBefore = src.getTime(); //得到前3月的时间

      SimpleDateFormat sdf = new SimpleDateFormat(format); //设置时间格式
      String defaultStartDate = sdf.format(dBefore); //格式化前3月的时间

      return Integer.parseInt(defaultStartDate);
   }

   public int beforeDateByWeek(Calendar src, int beforeweeks, String format) {
      if (format == null) {
         format = ("yyyyMMdd");
      }
      src.add(Calendar.WEEK_OF_MONTH, -beforeweeks);
      src.set(GregorianCalendar.DAY_OF_WEEK, GregorianCalendar.FRIDAY);
      Date dBefore = src.getTime(); //得到前3月的时间

      SimpleDateFormat sdf = new SimpleDateFormat(format); //设置时间格式
      String defaultStartDate = sdf.format(dBefore); //格式化前3月的时间

      return Integer.parseInt(defaultStartDate);
   }

   public int beforeDateByMonth(Calendar src, int beforeweeks, String format) {
      if (format == null) {
         format = ("yyyyMMdd");
      }
      src.add(Calendar.MONTH, -beforeweeks);
      System.out.println("Final Result:" + src.getTime());
      Date dBefore = src.getTime(); //得到前3月的时间

      SimpleDateFormat sdf = new SimpleDateFormat(format); //设置时间格式
      String defaultStartDate = sdf.format(dBefore); //格式化前3月的时间

      return Integer.parseInt(defaultStartDate);
   }

   /**
    * 校验指定的日期是否在节日列表中
    * 具体节日包含哪些,可以在HolidayMap中修改
    * @author shenjunjie
    */
   public boolean checkHolidayJoda(DateTime dateTime) {
         getHolidays();
      //先检查是否是周六周日(有些国家是周五周六)
      if (dateTime.getDayOfWeek() == 6 || dateTime.getDayOfWeek() == 7) {
         return true;
      }
      if (holidays.containsKey(dateTime.getMonthOfYear())) {
         if (holidays.get(dateTime.getMonthOfYear()).contains(dateTime.getDayOfMonth())) {
            return true;
         }
      }
      return false;
   }
   /**
    * 校验指定的日期是否在节日列表中
    * 具体节日包含哪些,可以在HolidayMap中修改
    *
    * @param src 要校验的日期(源)
    * @author shenjunjie
    */
   public boolean checkHoliday(Calendar src) {
      boolean result = false;
      getHolidays();
      //先检查是否是周六周日(有些国家是周五周六)
      if (src.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || src.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
         return true;
      }
      if (holidays.containsKey(src.get(Calendar.MONTH)+1)) {
         if (holidays.get(src.get(Calendar.MONTH)+1).contains(src.get(Calendar.DAY_OF_MONTH))) {
            return true;
         }
      }
      return false;
   }

   /**
    * 初始化节日List,请在这里添加新的节日
    * 加的时候请尽量使用Calendar自带的常量而不是魔鬼数字
    * 注:年份可以随便写,因为比的时候只比月份和天
    *
    * @author shenjunjie
    */
//   private void initHolidayList() {
//      holidayList = new SparseArray<>();
//
//      //五一劳动节
//      Calendar may1 = Calendar.getInstance();
//      may1.set(Calendar.MONTH, Calendar.MAY);
//      may1.set(Calendar.DAY_OF_MONTH, 1);
//      holidayList.put(holidayList.size(), may1);
//
//      Calendar may2 = Calendar.getInstance();
//      may2.set(Calendar.MONTH, Calendar.MAY);
//      may2.set(Calendar.DAY_OF_MONTH, 2);
//      holidayList.put(holidayList.size(), may2);
//
//      Calendar may3 = Calendar.getInstance();
//      may3.set(Calendar.MONTH, Calendar.MAY);
//      may3.set(Calendar.DAY_OF_MONTH, 3);
//      holidayList.put(holidayList.size(), may3);
//
//      Calendar h3 = Calendar.getInstance();
//      h3.set(2000, 1, 1);
//      holidayList.put(holidayList.size(), h3);
//
//      Calendar h4 = Calendar.getInstance();
//      h4.set(2000, 12, 25);
//      holidayList.put(holidayList.size(), h4);
//
//      //端午节
//      Calendar h5 = Calendar.getInstance();
//      h5.set(2000, 6, 9);
//      holidayList.put(holidayList.size(), h5);
//      Calendar h6 = Calendar.getInstance();
//      h6.set(2000, 6, 10);
//      holidayList.put(holidayList.size(), h6);
//
//      Calendar h7 = Calendar.getInstance();
//      h7.set(2000, 9, 15);
//      holidayList.put(holidayList.size(), h7);
//      Calendar h8 = Calendar.getInstance();
//      h8.set(2000, 9, 16);
//      holidayList.put(holidayList.size(), h8);
//
//      //中国母亲节:五月的第二个星期日
//      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.put(holidayList.size(), may5);
//   }


   public void testAddDateByWorkDay() {
      Calendar src = Calendar.getInstance();
      src.set(2010, Calendar.APRIL, 29);
      Calendar result = addDateByWorkDay(src, 2);
      Calendar expected = Calendar.getInstance();
      expected.set(2010, Calendar.MAY, 4);
//        Assert.assertEquals(expected.getTime().toString(), result.getTime().toString());
   }


   public void testAddDateByWorkDay2() {
      //测试母亲节
      Calendar src = Calendar.getInstance();
      src.set(2010, Calendar.MAY, 7);
      Calendar result = addDateByWorkDay(src, 2);
      Calendar expected = Calendar.getInstance();
      expected.set(2010, Calendar.MAY, 11);
//        Assert.assertEquals(expected.getTime().toString(), result.getTime().toString());
   }

   /**
    * 获得所在日期的周五日期
    */
   public int getFriday(Calendar date, String format) {
      if (format == null) {
         format = ("yyyyMMdd");
      }
      date.set(GregorianCalendar.DAY_OF_WEEK, GregorianCalendar.FRIDAY);
      Date dBefore = date.getTime(); //得到前3月的时间
      SimpleDateFormat sdf = new SimpleDateFormat(format); //设置时间格式
      String defaultStartDate = sdf.format(dBefore); //格式化前3月的时间

      return Integer.parseInt(defaultStartDate);
   }

   /**
    * 获得上周五日期
    */
   public int getLastFriday(Calendar date, String format) {
      if (format == null) {
         format = ("yyyyMMdd");
      }
      date.set(GregorianCalendar.DAY_OF_WEEK, GregorianCalendar.FRIDAY);
      date.add(Calendar.DATE, -7);
      Date dBefore = date.getTime(); //得到前3月的时间
      SimpleDateFormat sdf = new SimpleDateFormat(format); //设置时间格式
      String defaultStartDate = sdf.format(dBefore); //格式化前3月的时间

      return Integer.parseInt(defaultStartDate);
   }

   public static void main(String[] args) {

      Calendar may1 = Calendar.getInstance();
      may1.set(Calendar.MONTH, Calendar.JUNE);
      may1.set(Calendar.DAY_OF_MONTH, 11);
  String aaa= new DateUtil(). getToday(null);
      Calendar cal = Calendar.getInstance();
      cal.set(GregorianCalendar.DAY_OF_WEEK, GregorianCalendar.FRIDAY);
      cal.add(Calendar.DATE, -7);
// 也可以写成:cal.set(GregorianCalendar.DAY_OF_WEEK,6);
      Date dBefore = cal.getTime(); //得到前3月的时间

      SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); //设置时间格式
      String defaultStartDate = sdf.format(dBefore); //格式化前3月的时间

      int aa = Integer.parseInt(defaultStartDate);

//        src.set(2016, Calendar.APRIL , 1);
      String date = "20160412";
      cal.set(Integer.parseInt(date.substring(0, 4)), Integer.parseInt(date.substring(4, 6)) - 1, Integer.parseInt(date.substring(6, 8)));
      int maxdate = new DateUtil().getFriday(cal, null);
      aa = new DateUtil().beforeDateByWorkDay(cal, 60, null);
      Calendar expected = Calendar.getInstance();
      expected.set(2010, Calendar.MAY, 4);
   }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI算法网奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值