需求要實現按周統計某個數量,本來以爲調用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;
}
經過測試得出的值是一致的