问题描述:
在业务中会有传不同日期格式,
1、有天(2020-02-29),周(2020-03第三周),月(2020-02二月份),
2、同时需要计算对应的去年同比时间和环比(就是上一个时间段,周的2020-03环比就是2020-04)时间,
3、同时还要获取周和月的开始时间和结束时间,比如周2020-02的开始是2020-01-06,结束时间是2020-01-12,
4、周的第一天从周一开始算,周跨年有大于等于四天在今年就算今年最后一周,否则就是明年的第一周
最麻烦的就是查询周的同比和环比问题,因为涉及跨年和周一是第一天的特殊情况,最后在摸索了一天后学会了java的Calendar工具怎么用了,直接上通用方法。
下面这个方法是获取同比环比周的第一天日期,第二个方法是把这个日期转换成周格式(xxxx-xx)
/**
* 同比环比周, xxxx-xx,
* @param date 格式必须是xxxx-xx
* @param type 0是当前
* 1是同比
* 2是环比
*/
public static Date getCompareWeek(String date, int type) {
int year = Integer.parseInt(date.substring(0, 4));
int week = Integer.parseInt(date.substring(5, 7));
Calendar cal = Calendar.getInstance();
cal.setFirstDayOfWeek(Calendar.MONDAY);
cal.setMinimalDaysInFirstWeek(4);
cal.set(Calendar.YEAR, year);
cal.set(Calendar.WEEK_OF_YEAR, week);
int plus;
if (type == 1)
if (week == 53)
plus = cal.getWeeksInWeekYear();
else
plus = 52;
else if (type == 2)
plus = 1;
else
plus = 0;
cal.add(Calendar.WEEK_OF_YEAR, -plus);
return cal.getTime();
}
备注:3月21号修改,之前有个bug,因为calendar在判断周的日期的时候会根据当前时间的周时间变化,例如今天周五,同比去年的第五周就会到去年第五周的周五,同理如果是今天是周一也就会到去年第五周的周一,这样有可能会有问题了。具体还是自己试验一下会更清楚一些。例如2021-01的同比和环比周问题
/**
* 一周最少四天,每周从周一开始是第一天,获取周格式日期 xxxx-xx
* @return xxxx-xx
* @throws ParseException
*/
public static String getCurrentWeekWithYearStartWithMonday(Date dateDesc) {
Calendar c = Calendar.getInstance();
c.setTime(dateDesc);
c.setFirstDayOfWeek(Calendar.MONDAY);
c.setMinimalDaysInFirstWeek(4);
Date time = c.getTime();
int day = c.get(Calendar.DAY_OF_MONTH);
int week = c.get(Calendar.WEEK_OF_YEAR);
int year = c.get(Calendar.YEAR);
if (day > 28 && week == 1) {
year++;
} else if (day < 4 && week == getWeeksOfYear(dateDesc)){
year--;
}
return String.format("%04d-%02d", year, week);
}
public static int getWeeksOfYear(int year) {
Calendar cal = Calendar.getInstance();
cal.setFirstDayOfWeek(Calendar.MONDAY);
cal.setMinimalDaysInFirstWeek(4);
cal.set(Calendar.YEAR, year);
return cal.getWeeksInWeekYear();
}
public static int getWeeksOfYear(Date date) {
Calendar cal = Calendar.getInstance();
cal.setFirstDayOfWeek(Calendar.MONDAY);
cal.setMinimalDaysInFirstWeek(4);
cal.setTime(date);
return cal.getWeeksInWeekYear();
}
这个是中国标准的日历星期说明,所有定义都是从这里来的。