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

xiaoxiao2021-02-28  62

应用场景:获取前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; } }

转载请注明原文地址: https://www.6miu.com/read-33093.html

最新回复(0)