目录
场景:
用户选择默认的星期作为收货星期,需要转化为日期。比如用户默认是星期三收货,今天是星期四,那么系统需要计算下个星期三的日期。
描述:
使用字符串 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,表示原先是星期日,再次赋值为7
today=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);
}