版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a_step_further/article/details/74931032
应用场景:获取前N周的日期,且需要指定星期值(如周一、周二)。例如,获取前面第N个星期三当天的日期
输入:1. 初始化日期,即从哪个日期值开始往前查询(支持 yyyyMMdd, yyyy-MM-dd, yyyy-MM-dd hh:mi:ss);2. 周区间的个数;3. 指定星期值(仅限于缩写 "SUN","MON","TUE","WED","THU","FRI","SAT")
输入:1. 初始化日期,即从哪个日期值开始往前查询(支持 yyyyMMdd, yyyy-MM-dd, yyyy-MM-dd hh:mi:ss);2. 周区间的个数;3. 指定星期值(仅限于缩写 "SUN","MON","TUE","WED","THU","FRI","SAT")
输出:日期值,格式 yyyy-MM-dd
适用于阿里云MaxCompute平台的UDF源码:
import com.aliyun.odps.udf.UDF;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
public final class getSpecificNumberWeek extends UDF{
public String evaluate(String inputDateStr, Long weekNum, String weekName) throws ParseException {
//先获取输入的日期是一周中第几天
Date date = null;
if (inputDateStr.length() == 19) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
date = sdf.parse(inputDateStr);
} else if (inputDateStr.length() == 10) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
date = sdf.parse(inputDateStr);
} else if (inputDateStr.length() == 8) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
date = sdf.parse(inputDateStr);
}
Calendar cal = Calendar.getInstance();
cal.setTime(date);
Integer curWeekIndex = cal.get(Calendar.DAY_OF_WEEK);
// System.out.println(curWeekIndex);
//获取输入周X是一周中第几天
List<String> weekList = Arrays.asList("SUN","MON","TUE","WED","THU","FRI","SAT");
Integer targetWeekIndex = weekList.indexOf(weekName)+1;
// System.out.println(targetWeekIndex);
if(targetWeekIndex.equals(-1)){
System.out.println("INPUT WEEK DAY DOES NOT EXIST");
return null;
}
//判断并输出weekNum 个周期前的weekName
Calendar returnDate = Calendar.getInstance();
returnDate.setTime(date);
if(curWeekIndex < targetWeekIndex){
returnDate.add(Calendar.DAY_OF_MONTH, (-1)*(7*weekNum.intValue() + curWeekIndex+7-targetWeekIndex));
}else{
returnDate.add(Calendar.DAY_OF_MONTH, (-1)*(7*weekNum.intValue() + curWeekIndex - targetWeekIndex));
}
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String returnDateStr = format.format(returnDate.getTime());
return returnDateStr;
}
}