UDF函数对输入的时间按不同维度年,月,日,时,分,秒的增减

   需求:给输入的时间字段,按照输入的维度类型,进行增减操作,比如2018-10-23 23:00:91 显示三周后的日期。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDF;

public class UDFDateSub  extends UDF
{
    private final SimpleDateFormat sdfIn1 = new SimpleDateFormat("yyyyMMdd");//目前固定三种类型,可以自定义多种解析格式
    private final SimpleDateFormat sdfIn2 = new SimpleDateFormat("yyyy-MM-dd");
    private final SimpleDateFormat sdfIn3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    private SimpleDateFormat sdf = null;
    private final Calendar calendar = Calendar.getInstance();

    private Date date = null;

    public String evaluate(String col, String type, int num)
    {
        if (StringUtils.isBlank(col))
            return null;
        if (StringUtils.isBlank(type))
            throw new RuntimeException("输入类型参数不能为空!");

        try
        {
            if (col.length() == 8) // yyyyMMdd
            {
                sdf = sdfIn1;
                date = sdfIn1.parse(col);
            } else if (col.length() == 10) // yyyy-MM-dd
            {
                sdf = sdfIn2;
                date = sdfIn2.parse(col);
            } else if (col.length() == 19) // yyyy-MM-dd HH:mm:ss
            {
                sdf = sdfIn3;
                date = sdfIn3.parse(col);
            } else
                return null;

            calendar.setTime(date);

            if (type.toUpperCase().equals("SECOND")) {  //这里还可以通过大小写转换函数,忽略输入的字符大小写问题
                calendar.add(Calendar.SECOND, num);
            }
            else if (type.equals("MINUTE")) {
                calendar.add(Calendar.MINUTE, num);
            }
            else if (type.equals("HOUR")) {
                calendar.add(Calendar.HOUR_OF_DAY, num);
            }
            else if (type.equals("DAY")) {
                calendar.add(Calendar.DAY_OF_YEAR, num);
            }
            else if (type.equals("WEEK")) {
            calendar.add(Calendar.WEEK_OF_YEAR, num);
            }
            else if (type.equals("MONTH")) {
                calendar.add(Calendar.MONTH, num);
            }
            else if (type.equals("QUARTER")) {  //QUARTER季度,三个月
                calendar.add(Calendar.MONTH, num * 3);
            }
            else if (type.equals("YEAR")) {
                calendar.add(Calendar.YEAR, num);
            }else   throw new RuntimeException("输入类型参数不在允许列表内!");

            return sdf.format(calendar.getTime());
        } catch (ParseException ex)
        {
            throw new RuntimeException(ex);
        }
    }

    public static void main(String[] args) throws Exception
    {
        UDFDateSub ds = new UDFDateSub();
        System.out.println(ds.evaluate("2018-04-21", "QUARTER", -1)); //日期减去一个季度,三个月
        System.out.println(ds.evaluate("2018-04-21", "WEEK", 3));  //日期增加三周
        System.out.println(ds.evaluate("2018-05-21", "MONTH", 2));  //日期增加两个月
        System.out.println(ds.evaluate("2018-04-21", "YEAR", 1));  //日期增加一年
        System.out.println(ds.evaluate("20180421", "DAY", -3)); //日期减去三天
        System.out.println(ds.evaluate("2018-04-21 11:12:13", "HOUR", -13));//日期减去13个小时
        System.out.println(ds.evaluate("2018-04-21 11:12:13", "HOUR", 14));//日期增加14个小时
    }    
}
/*输出结果如下:
        2018-01-21
        2018-05-12
        2018-07-21
        2019-04-21
        20180418
        2018-04-20 22:12:13
        2018-04-22 01:12:13
*/

你可能感兴趣的:(Hive编程和数据仓库)