需求:给定任意符合要求的日期,返回其属于当年的第几周?
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