得到指定的偏移日期,遇到节假日就跳过,重新偏移定位日期(代码片段)

小智RE0 小智RE0     2022-11-19     215

关键词:

  • 最近有这样一段处理,需要在指定的日期自动打开某个任务;
  • 这个指定日期可根据设置的参数[偏移量]进行控制;
  • 但是需要对应真实的节假日,如果是节假日,则不可以去打开那个日期的任务;
  • 即遇到节假日需要向前/向后(根据偏移量的实际情况进行判断)推算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 天,跳过指定日期

...n天后哪一天的最佳方法,但不包括某些日期(邮政服务节假日/星期日)。例如,从12月20日开始的5天:12月21日=112月22日=212月23日=跳过(星期日)12月24日=312月25日=跳过(圣诞节)12月26日=412月27日=5我的设置将 查看详情

[css揭秘]灵活的背景定位

...我们有了更好的解决方案。CSS3时代,background-position属性得到了扩展,允许我们指定背景图片距离任意角的偏移量,只需要在偏移量前面指定方位关键字即可。对于每一个被 查看详情

偏移 25 处无法解析的日期

...析为yyyy-MM-dd\'T\'HH:mm:ssz的StandardFormat,但我总是在第25位得到ParseException。//Getahumanreadableformat.Dat 查看详情

元素偏移量offset系列

...,就是偏移量,我们使用offset系列相关属性,可以动态的得到该元素的位置(偏移)、大小等。获取元素距离带有定位父元素的位置。获得元素自身的大小(宽度高度)。注意:返回的数值都不带单位。offset系列常用属性:offset... 查看详情

元素偏移量offset

...过来就是偏移量,我们使用offset系列相关属性可以动态的得到该元素的位置(偏移)、大小等。获得元素距离带有定位父元素的位置获得元素自身的大小(宽度高度)注意:返回的数值都不带单位offset与style区别offsetstyleoffset可... 查看详情

使用偏移量计算 JavaScript 日期时间

】使用偏移量计算JavaScript日期时间【英文标题】:CalculatingJavaScriptdatetimewithoffset【发布时间】:2012-12-1713:10:27【问题描述】:我在GMT时区偏移计算中遇到了一些意想不到的结果。我正在使用ExtJS日期类来帮助计算消息从GMT0的服... 查看详情

html5leftjcenter是啥属性

参考技术ACSSleft属性用来指定被定位元素左侧边缘的位置。该属性定义了被定位元素左侧外边距边界与其包含块元素左侧边界之间的偏移。left是一个偏移属性,偏移属性用于指定一个被定位元素的精确位置,对于static的元素没有... 查看详情

javascript显示中的时区偏移

】javascript显示中的时区偏移【英文标题】:timezoneoffsetinjavascriptdisplay【发布时间】:2013-01-2101:34:18【问题描述】:我遇到了一个常见问题,即使用javascript日期选择器显示并允许用户从可用日程安排日期的日历中选择日期以进行... 查看详情

css定位

定位属性:使元素脱离正常的文档流,“漂浮”在指定的位置上的css属性。position:设置定位属性的方式。relative:相对定位,对象遵循普通流,当前元素参照父元素的左上角进行位置偏移。absolute:绝对定位,对象脱离普通流,当... 查看详情

深入理解css定位中的偏移

×目录[1]定位[2]包含块[3]偏移属性[4]绝对定位[5]格式化[6]auto前面的话  CSS有三种基本的定位机制:普通流、浮动和绝对定位。利用定位,可以准确地定义元素框相对于其正常位置应该出现的位置,或者相对于父元素、另一... 查看详情

relative相对定位/定位偏移

...的移动之后原始位置会被保留);  c、如果没有定位偏移量,对元素本身没有任何影响;  d、提高层级(也就是权重问题);  定位元素的位置控制    top/right/bottom/left 定位元素的偏移量二、position;absolute;绝对 查看详情

深入理解定位父级offsetparent及偏移大小

×目录[1]定位父级[2]偏移大小[3]页面偏移[4]注意事项前面的话  偏移量(offsetdimension)是javascript中的一个重要的概念。涉及到偏移量的主要是offsetLeft、offsetTop、offsetHeight、offsetWidth这四个属性。当然,还有一个偏移参照—&... 查看详情

巴西的 ZonedDateTime 仍然得到 -2 而不是 -3 偏移量

】巴西的ZonedDateTime仍然得到-2而不是-3偏移量【英文标题】:ZonedDateTimeinBrazilstillgetting-2insteadof-3offset【发布时间】:2020-06-0506:33:19【问题描述】:我正在开发一个使用Java8、Maven和Spring的应用程序。自2019年起,巴西取消了夏令时... 查看详情

深入理解定位父级offsetparent及偏移大小

偏移量(offsetdimension)是javascript中的一个重要的概念。涉及到偏移量的主要是offsetLeft、offsetTop、offsetHeight、offsetWidth这四个属性。当然,还有一个偏移参照——定位父级offsetParent。本文将详细介绍该部分内容 定位父级  在理... 查看详情

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

...能:重新定位文件读写位置距离文件起始的偏移参数:fd:指定了具体的文件offset:偏移whence:SEEK_SET:offset就是文件的偏移位置指向文件的头部SEEK 查看详情

定位父级offsetparent及偏移大小

偏移量(offsetdimension)是javascript中的一个重要的概念。涉及到偏移量的主要是offsetLeft、offsetTop、offsetHeight、offsetWidth这四个属性。当然,还有一个偏移参照——定位父级offsetParent。本文将详细介绍该部分内容650)this.width=650;"src="https... 查看详情

如何在 Java 中偏移日期以适应 DST

...】:我有一份用Java编写的工作,该工作每天在该时区的指定时间运行。例如,如果我在0800时第一次开始工作,它必须每天在同一时间运行工作。如果时区不遵循DST,这可以正常工作。但如果它遵循DST,它就会中断。例如,如果... 查看详情

带有 pytz 时区的日期时间。不同的偏移量取决于 tzinfo 的设置方式[重复]

】带有pytz时区的日期时间。不同的偏移量取决于tzinfo的设置方式[重复]【英文标题】:datetimewithpytztimezone.Differentoffsetdependingonhowtzinfoisset[duplicate]【发布时间】:2014-07-0503:11:34【问题描述】:我今天遇到了一个有趣的情况。谁能... 查看详情