得到指定的偏移日期,遇到节假日就跳过,重新偏移定位日期

Posted 小智RE0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了得到指定的偏移日期,遇到节假日就跳过,重新偏移定位日期相关的知识,希望对你有一定的参考价值。

  • 最近有这样一段处理,需要在指定的日期自动打开某个任务;
  • 这个指定日期可根据设置的参数[偏移量]进行控制;
  • 但是需要对应真实的节假日,如果是节假日,则不可以去打开那个日期的任务;
  • 即遇到节假日需要向前/向后(根据偏移量的实际情况进行判断)推算1天,
  • 如此循环直到得到非节假日,返回该日期.

可定义日期表实体类MyDateEntity

public class MyDateEntity
    /**
     * 日期;
     */
    private String date;
    /**
     * 是否为节假日期:  1:是节假日  0:不是节假日
     */
    private String isHoliday;

    public MyDateEntity() 
        
    

    public MyDateEntity(String date, String isHoliday) 
        this.date = date;
        this.isHoliday = isHoliday;
    

    public String getDate() 
        return date;
    

    public void setDate(String date) 
        this.date = date;
    

    public String getIsHoliday() 
        return isHoliday;
    

    public void setIsHoliday(String isHoliday) 
        this.isHoliday = isHoliday;
    

对应在数据库创建日期表;my_date表,只需要两个字段即可;


首先,这个方法getOffsetDay可以根据输入日期以及偏移量以及格式得到指定日期.

/**
 * 取得指定日期
 *
 * @param dateFrom   指定日期的字符串 [示例:20221022]
 * @param dateAmount 日期偏移量; 0 正数 负数都可;示例[0   /  1  / -1]
 * @param dateFormat 日期格式  例如: yyyyMMdd  [注意:需要和dateFrom格式对应]   
 */
public static String getOffsetDay(String dateFrom, int dateAmount, String dateFormat) 
    //dateTo 返回的指定日期
    String dateTo = null;
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat);
    Calendar cal = Calendar.getInstance();
    Date date = null;
    try 
        date = simpleDateFormat.parse(dateFrom);
        cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DAY_OF_MONTH, dateAmount);

     catch (Exception e) 
        //异常处理;......

     finally 
        dateTo = simpleDateFormat.format(cal.getTime());
    
    return dateTo;


注意该方法只是得到处理后的偏移日期;
注意在调用方法时; 参数:dayOffset是外面可控制的,便于灵活使用.

/**
 * <p>1: 先根据偏移量,根据自然日得到指定日期;</p>
 * <p>2: 判断当前得到的日期是否为节假日</p>
 * <p>3: 判断节假日;[isHoliday]---[0:否][1:是]</p>
 * <p>4: 如果是节假日;根据偏移量正负数;若正向递增偏移,则每次按自然日向前推一天;再次判断是否为节假日.</p>
 * <p>5: 如果是节假日;根据偏移量正负数;若负向递减偏移,则每次按自然日向后推一天;再次判断是否为节假日</p>
 * <p>6: 直到不是节假日时;得到的就是需要处理的日期;</p>
 *
 * @param dayOffset 日期偏移量值  0   正数(例如1) 负数(例如-1)
 * @param date            传入的日期
 * @author 小智RE0
 */
public static String isHolidayDateDeal(String dayOffset, String date) 

    String dateStart = date;


    int dateAmount = Integer.parseInt(dayOffset);
    //根据偏移量,调整时间日期;  先按照自然日处理偏移日期
    String dateDeal = getOffsetDay(dateStart, dateAmount, "yyyyMMdd");

    //是否为节假日  1-是节假日; 0:非节假日;
    String isHoliday = "1";
    while (!"0".equals(isHoliday)) 

        //查询 my_date表; 以 dateDeal 作为条件,查询当前日期所存的记录;
        MyDateEntity myDateEntity = XXXXXX具体的SQL处理[];
      
        if (myDateEntity != null) 

            //判断是否为节假日;
            isHoliday = myDateEntity.getIsHoliday();

            if ("0".equals(isHoliday)) 
                //非节假日,可以退出;
                break;
             else if ("1".equals(isHoliday)) 
                //节假日;需要再处理日期;
                //先记录当前节假日天数;
                //偏移天数;
                if (dateAmount >= 0) 
                    //偏移量为date+N;
                    //若得到的日期一直不是节假日,则进行循环加1个自然日,直至得到非节假日;
                    dateDeal = getOffsetDay(dateDeal, 1, "yyyyMMdd");

                 else 
                    //偏移量为date-N;
                    //若得到的日期一直不是节假日,则进行循环减1个自然日,直至得到非节假日;
                    dateDeal = getOffsetDay(dateDeal, -1, "yyyyMMdd");
                
            
         else 
            //避免死循环;
            //当然也可以控制 dayOffset 在设置参数时的控制,避免出现[my_date]表找不到当前日期的情况; 
            //或者保障[my_date]表中维护的日期记录足够多;
            break;
        
    

    //最终使用的日期
    return dateDeal;


以上是关于得到指定的偏移日期,遇到节假日就跳过,重新偏移定位日期的主要内容,如果未能解决你的问题,请参考以下文章

计算 n 天,跳过指定日期

dup文件锁库函数函数调用(day07)

元素偏移量offset系列

元素偏移量offset系列

偏移 25 处无法解析的日期

css中的定位