hadoop UDF-获取前N周的日期时间点

版权声明:本文为博主原创文章,未经博主允许不得转载。 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")

输出:日期值,格式 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;
    }
}


猜你喜欢

转载自blog.csdn.net/a_step_further/article/details/74931032