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


    • 最近有这样一段处理,需要在指定的日期自动打开某个任务;
    • 这个指定日期可根据设置的参数[偏移量]进行控制;
    • 但是需要对应真实的节假日,如果是节假日,则不可以去打开那个日期的任务;
    • 即遇到节假日需要向前/向后(根据偏移量的实际情况进行判断)推算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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    对应在数据库创建日期表;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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

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

    /**
     * 

    1: 先根据偏移量,根据自然日得到指定日期;

    *

    2: 判断当前得到的日期是否为节假日

    *

    3: 判断节假日;[isHoliday]---[0:否][1:是]

    *

    4: 如果是节假日;根据偏移量正负数;若正向递增偏移,则每次按自然日向前推一天;再次判断是否为节假日.

    *

    5: 如果是节假日;根据偏移量正负数;若负向递减偏移,则每次按自然日向后推一天;再次判断是否为节假日

    *

    6: 直到不是节假日时;得到的就是需要处理的日期;

    * * @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; }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

  • 相关阅读:
    vue上传文件到阿里云oss方法 结合element-ui 中的 el-upload
    现代信号处理——平稳随机信号的功率谱密度
    C进阶-数据的存储(下)
    Allegro调丝印规范操作指导
    C2. k-LCM (hard version)-Codeforces Round #708 (Div. 2)
    可执行文件的装载与进程
    10-Linux输入输出
    白话强化学习(理论+代码)
    Mac系统下Carina初体验
    virtuoso环形振荡器
  • 原文地址:https://blog.csdn.net/MrTumnus/article/details/127460806