UDF函数:返回任意日期属于一年中的第几周

需求:给定任意符合要求的日期,返回其属于当年的第几周?

package cnsuning.udf.functions.date;
import org.apache.commons.lang.time.DateUtils;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

import java.text.ParseException;
import java.util.Calendar;
import java.util.Locale;
import java.util.TimeZone;

//注意周日是1,周一是2,以此类推,周六是7,因为这里按照欧美制每一周的第一天是周日。
public class UDFWeekNum extends UDF  {
    final String[] parsePatterns = { "yyyyMMdd", "yyyy-MM-dd" };

    Calendar calendar = null;
    int week = -1;
    int weekLast = -1;
    int month = -1;

    public UDFWeekNum()
    {
        Locale.setDefault(Locale.CHINA);
        calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
        calendar.setFirstDayOfWeek(Calendar.SUNDAY);
    }

    public Text evaluate(Text str) throws ParseException
    {
        if (str == null)
            return null;

        calendar.setTime(DateUtils.parseDate(str.toString(), parsePatterns));

        week = calendar.get(Calendar.WEEK_OF_YEAR);
        month = calendar.get(Calendar.MONTH);

        calendar.add(Calendar.DAY_OF_MONTH, -7);
        weekLast = calendar.get(Calendar.WEEK_OF_YEAR);

        if (weekLast > week && month == Calendar.DECEMBER)
            week = weekLast + 1;

        if (week < 10)
            return new Text("0" + week);
        else
            return new Text(String.valueOf(week));
    }

    public static void main(String[] args) throws Exception
    {
        UDFWeekNum o = new UDFWeekNum();
        System.out.println("2018-01-01:             "+o.evaluate(new Text("2017-01-01")));
        System.out.println("2017-01-01:            "+o.evaluate(new Text("2018-01-01")));
        System.out.println("2017-01-01:            "+o.evaluate(new Text("2018-01-01")));
        System.out.println("2018-01-06:            "+o.evaluate(new Text("2018-01-06")));
        System.out.println("2018-01-07:            "+o.evaluate(new Text("2018-01-07")));
        System.out.println("2018-01-08:            "+o.evaluate(new Text("2018-01-08")));
        System.out.println("2018-02-01:            "+o.evaluate(new Text("2018-02-01")));      
        System.out.println("2017-04-02:            "+o.evaluate(new Text("2017-04-02")));
        System.out.println("2018-12-31:            "+o.evaluate(new Text("2018-12-31")));
        System.out.println("2018-12-31:            "+o.evaluate(new Text("2017-12-31")));
        System.out.println("20170107:            "+o.evaluate(new Text("20170107")));
    }
}
输出结果如下:
2018-01-01:            01
2017-01-01:            01
2017-01-01:            01
2018-01-06:            01
2018-01-07:            02
2018-01-08:            02
2018-02-01:            05
2017-04-02:            14
2018-12-31:            53
2018-12-31:            53
20170107:              01


猜你喜欢

转载自blog.csdn.net/qq_26442553/article/details/80150170