最近在做项目的过程中遇到了一个问题,就是我利用java的日期工具类获取周数的时候发现跟数据库的周数(特别是年与年的临界值)对应不上,故就做了一些分析,发现这里面还是有些玄机的。在获取周数的时候有两个重要的参数
//设置周一是一周的开始
calendar.setFirstDayOfWeek(Calendar.MONDAY);
// 每年的第一周最少有几天 odps函数 weekofyear 4天以上
calendar.setMinimalDaysInFirstWeek(4);
1、设置 周一作为没周的第一天,每年的第一周最少包含4天
/**
* 根据日期字符串获取是当年的第几周
* @param date_str 格式 yyyy-MM-dd
* @return
*/
public static Integer getWeekOfYear(String date_str) {
try {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = format.parse(date_str);
Calendar calendar = Calendar.getInstance();
// 设置周一是一周的开始
calendar.setFirstDayOfWeek(Calendar.MONDAY);
// 每年的第一周最少有几天 odps函数 weekofyear 4天以上
calendar.setMinimalDaysInFirstWeek(4);
calendar.setTime(date);
return calendar.get(Calendar.WEEK_OF_YEAR);
} catch (Exception e) {
return null;
}
}
System.out.println("2017-01-01>>>>>>>>"+getWeekOfYear("2017-01-01"));
System.out.println("2017-01-02>>>>>>>>"+getWeekOfYear("2017-01-02"));
System.out.println("2017-11-12>>>>>>>>"+getWeekOfYear("2017-11-12"));
System.out.println("2017-11-13>>>>>>>>"+getWeekOfYear("2017-11-13"));
System.out.println("2016-05-01>>>>>>>>"+getWeekOfYear("2016-05-01"));
System.out.println("2016-05-02>>>>>>>>"+getWeekOfYear("2016-05-02"));
System.out.println("2017-12-31>>>>>>>>"+getWeekOfYear("2017-12-31"));
System.out.println("2018-01-01>>>>>>>>"+getWeekOfYear("2018-01-01"));
System.out.println("2014-12-29>>>>>>>>"+getWeekOfYear("2014-12-29")); //1
System.out.println("2014-12-31>>>>>>>>"+getWeekOfYear("2014-12-31")); //1
System.out.println("2015-12-29>>>>>>>>"+getWeekOfYear("2015-12-29")); //53
得到
2017-01-01>>>>>>>>52
2017-01-02>>>>>>>>1
2017-11-12>>>>>>>>45
2017-11-13>>>>>>>>46
2016-05-01>>>>>>>>17
2016-05-02>>>>>>>>18
2017-12-31>>>>>>>>52
2018-01-01>>>>>>>>1
2014-12-29>>>>>>>>1
2014-12-31>>>>>>>>1
2015-12-29>>>>>>>>53
2、不进行任何设置
/**
* 根据日期字符串获取是当年的第几周
* @param date_str 格式 yyyy-MM-dd
* @return
*/
public static Integer getWeekOfYear(String date_str) {
try {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = format.parse(date_str);
Calendar calendar = Calendar.getInstance();
// 设置周一是一周的开始
// calendar.setFirstDayOfWeek(Calendar.MONDAY);
// 每年的第一周最少有几天 odps函数 weekofyear 4天以上
// calendar.setMinimalDaysInFirstWeek(4);
calendar.setTime(date);
return calendar.get(Calendar.WEEK_OF_YEAR);
} catch (Exception e) {
return null;
}
}
调用
System.out.println("2017-01-01>>>>>>>>"+getWeekOfYear("2017-01-01"));
System.out.println("2017-01-02>>>>>>>>"+getWeekOfYear("2017-01-02"));
System.out.println("2017-11-12>>>>>>>>"+getWeekOfYear("2017-11-12"));
System.out.println("2017-11-13>>>>>>>>"+getWeekOfYear("2017-11-13"));
System.out.println("2016-05-01>>>>>>>>"+getWeekOfYear("2016-05-01"));
System.out.println("2016-05-02>>>>>>>>"+getWeekOfYear("2016-05-02"));
System.out.println("2017-12-31>>>>>>>>"+getWeekOfYear("2017-12-31"));
System.out.println("2018-01-01>>>>>>>>"+getWeekOfYear("2018-01-01"));
System.out.println("2014-12-29>>>>>>>>"+getWeekOfYear("2014-12-29")); //1
System.out.println("2014-12-31>>>>>>>>"+getWeekOfYear("2014-12-31")); //1
System.out.println("2015-12-29>>>>>>>>"+getWeekOfYear("2015-12-29")); //53
得到
2017-01-01>>>>>>>>1
2017-01-02>>>>>>>>1
2017-11-12>>>>>>>>46
2017-11-13>>>>>>>>46
2016-05-01>>>>>>>>19
2016-05-02>>>>>>>>19
2017-12-31>>>>>>>>1
2018-01-01>>>>>>>>1
2014-12-29>>>>>>>>1
2014-12-31>>>>>>>>1
2015-12-29>>>>>>>>1
总结:
这两个值设置的参数不一样获取的周数也就不一样,因为默认情况下calendar是把周日作为每周的第一天。如果在进行用周数进行查询或教研的逻辑时,一定要约定好设置参数,要不然就可能得不到自己想要的数据。