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