根据日期计算当前日期所在周是日期所在年份的第几周

xiaoxiao2021-02-28  107

最近在做项目的过程中遇到了一个问题,就是我利用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是把周日作为每周的第一天。如果在进行用周数进行查询或教研的逻辑时,一定要约定好设置参数,要不然就可能得不到自己想要的数据。

转载请注明原文地址: https://www.6miu.com/read-2250153.html

最新回复(0)