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

来源:互联网 发布:为什么叫软件定义网络 编辑:程序博客网 时间:2024/05/16 05:08

最近在做项目的过程中遇到了一个问题,就是我利用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>>>>>>>>522017-01-02>>>>>>>>12017-11-12>>>>>>>>452017-11-13>>>>>>>>462016-05-01>>>>>>>>172016-05-02>>>>>>>>182017-12-31>>>>>>>>522018-01-01>>>>>>>>12014-12-29>>>>>>>>12014-12-31>>>>>>>>12015-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>>>>>>>>12017-01-02>>>>>>>>12017-11-12>>>>>>>>462017-11-13>>>>>>>>462016-05-01>>>>>>>>192016-05-02>>>>>>>>192017-12-31>>>>>>>>12018-01-01>>>>>>>>12014-12-29>>>>>>>>12014-12-31>>>>>>>>12015-12-29>>>>>>>>1

总结:
这两个值设置的参数不一样获取的周数也就不一样,因为默认情况下calendar是把周日作为每周的第一天。如果在进行用周数进行查询或教研的逻辑时,一定要约定好设置参数,要不然就可能得不到自己想要的数据。

阅读全文
0 0