java周查询和mysql的yearWeek同步

需求要实现按周统计某个数量,本来以为调用mysql的week和java里calendar.get(Calendar.WEEK_OF_YEAR)就行了,结果发现对应不上,而且还有蛋疼的跨年问题,上一年的年末几日和这一年的开头几日可能属于同一周,而且根据天数分布这周可能归属于上一年也可能归属于下一年。mysql还好,有yearWeek方法,而java根本没有类似的方法calendar.get(Calendar.WEEK_OF_YEAR)根本没有包含年份信息,这一点也是比较奇怪,因为单独使用calendar.get(Calendar.WEEK_OF_YEAR)没什么意义。

我绝对参考百度上的日历,以星期一作为一周的开始

mysql使用yearweek(date,1)就行了

java则麻烦一点需要写个方法

    public static Integer getYearWeek(Date date) {
    	Calendar calendar = Calendar.getInstance();
    	calendar.setTime(date);
    	return getYearWeek(calendar);
    }
    public static Integer getYearWeek(Calendar calendar) {
    	calendar.setFirstDayOfWeek(Calendar.MONDAY);
    	calendar.setMinimalDaysInFirstWeek(4);
    	int week = calendar.get(Calendar.WEEK_OF_YEAR);
    	int year = calendar.get(Calendar.YEAR);
    	calendar.add(Calendar.DATE, -7);//获得上一周的周数
    	int lastWeek = calendar.get(Calendar.WEEK_OF_YEAR);
    	int lastYear = calendar.get(Calendar.YEAR);
    	if(week < lastWeek && year == lastYear) {//周数小于上一周,年数不变说明时间在年末,但是周数已经算到明年,年数需要+1
    		year += 1;
    	}
    	if(week > lastWeek && year > lastYear && lastWeek != 1) {//周数大于上周,年数也大于上周,并且上周不等于1,说明时间在新年的一月,但是周数还是去年的,年数需要-1
    		year -= 1;
    	}
    	return year * 100 + week;
    }

经过测试得出的值是一致的

你可能感兴趣的:(java通用)