使用1,2,3...代表星期,获取满足限定条件的下一个星期对应的日期

来源:互联网 发布:文泰2009端口设置 编辑:程序博客网 时间:2024/06/05 15:33

场景:

用户选择默认的星期作为收货星期,需要转化为日期。比如用户默认是星期三收货,今天是星期四,那么系统需要计算下个星期三的日期。

描述:

使用字符串 1,2,3,4,5,6,7星期一到星期日,并且,字符串可能是 1,2,3或者1,4,7等来限定星期的取值范围,这样的好处是,便于计算星期之间的差值。

比如今天是2017年08月31日 星期四,字符串为1,2,5,那么日期限定为星期一,星期二,星期五。系统应提供星期五日期。


算法思路:

根据今天日期与限定日期的差值,计算今天之后的第几天满足条件,如果本周没有满足条件的星期,则取下一周第一个满足限定条件的星期,计算和今天的差值,然后计算日期


使用 Calendar

java.util.Calendar
获取星期,这里需要注意的是,获取的值为整数0-6,对应关系为 1-星期日,2-星期一,3-星期二...7-星期六

Calendar cal = Calendar.getInstance();cal.setTime(new Date());cal.get(Calendar.DAY_OF_WEEK);

但是我们的字符串使用的是1-星期一,2-星期二,3-星期三...7-星期日

所以先对Calendar获取的星期做一个转化,即

int today=cal.get(Calendar.DAY_OF_WEEK)-1;//全部减1,if(today==0){//如果结果为0,表示原先是星期日,再次赋值为7today=7;}

Calendar 可以计算制定日期,几天之后的日期,比如一天之后

cal.add(Calendar.DAY_OF_YEAR, 1); //下一天



第一步:

获取今天星期几,并转化为规则 1-星期一,2-星期二,3-星期三...7-星期日

today

然后是字符串转化为数组-split(",")

1,2,3 ,5-> {1,2,3,5} ,这里array[0]=1,依次类推


遍历数组-需要转化为整形

如果,today=遍历值,则今天满足条件,设置标志位表示在本周得到预期日期,break;否则继续遍历。

如果,today<遍历值,则被遍历值满足条件,返回 今天+(遍历值和今天的星期差值)对应的日期,设置标志位表示在本周得到预期日期,break;否则继续遍历。


遍历结束

根据标志位判断遍历中是否得到预期日期,如果是则开始日期格式转化

否则,取下周的第一个符合限定星期的日期返回

星期日-today+数组[0]对应的日期


算法实现

/** * 返回最近的符合星期规则的日期 * @param distributionTime 入参为 1,2,3,4,7 表示 星期一,二,三依次类推 * //0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六,7-星期日 *  * @param dateType 返回的日期字符串格式 * @return */public static String getDefaultDistributionTime(String distributionTime,String dateType){Calendar cal = Calendar.getInstance();cal.setTime(new Date());cal.get(Calendar.DAY_OF_WEEK);//今天是int today=cal.get(Calendar.DAY_OF_WEEK)-1;if(today==0){today=7;}String[] array=distributionTime.split(",");boolean thisWeekFlag=false;for(int i=0;i<array.length;i++){//周日比较特殊-单独判断if(Integer.valueOf(array[i])==today){//System.out.println("就返回今天");thisWeekFlag=true;//就在本周break;}else if(Integer.valueOf(array[i])>today){//就返回这一天//System.out.println("就返回今天+"+(Integer.valueOf(array[i])-today)+" 天之后");cal.add(Calendar.DAY_OF_YEAR, (Integer.valueOf(array[i])-today)); //下一天thisWeekFlag=true;//就在本周break;}}//如果在循环遍历结束之后,依旧没有结果,则说明本周没有预期的结果,那就取下周的第一天if(!thisWeekFlag){//System.out.println("就返回今天+"+(7-today)+" 到周末了+"+array[0]+" 那天");cal.add(Calendar.DAY_OF_YEAR, 7-today+Integer.valueOf(array[0]));}return dateTimeToStr(new Date(cal.getTimeInMillis()),dateType); }





阅读全文
0 0
原创粉丝点击