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

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值