1. 根据当前年的第几周,获取日期时间段(已解决跨年问题)
2. 根据当前年的第几月,获取日期时间段
3. 根据年份,获取日期时间段(如果当前日期处于当前年中,则结束日期取当前日期)
4. 获取指定日期在指定年的第几周(已解决跨年问题)
提示:这里描述项目中遇到的问题:
- 根据当前年的第几周,获取日期时间段(已解决跨年问题)
public static void main(String[] args) {
// 202252表示2022年的第52周
String timeInterval = getTimeIntervalByWeekNo("202252");
System.out.println(timeInterval);
}
/**
* 根据当前年的周数,获取日期时间段
*
* @param time
* @return
*/
private static String getTimeIntervalByWeekNo(String time) {
int year = Integer.parseInt(time.substring(0, 4));
int week = Integer.parseInt(time.substring(4, 6));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
cal.setFirstDayOfWeek(Calendar.MONDAY);
cal.set(Calendar.YEAR, year);
cal.set(Calendar.WEEK_OF_YEAR, week);
cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek());
// 解决跨年问题,如果每年得第一天不是星期一,并且第一个星期一之前的天数不足4天,则每年的第一周从当年的第一个星期一开始算,星期一之前的统计在上一年
if (getFirstDayWeekDay(year) != 2 && Integer.parseInt(getFirstMondayByYear(time)) - Integer.parseInt(time + "0101") <= 3) {
cal.add(Calendar.DAY_OF_WEEK, 7);
}
String beginDate = sdf.format(cal.getTime());
cal.add(Calendar.DAY_OF_WEEK, 6);
String endDate = sdf.format(cal.getTime());
int currentDateNum = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
int endDateNum = Integer.parseInt(endDate.replace("-", ""));
// 如果每周结束日期比今日大,并且不超过7天,则最后一日取今天
if (endDateNum - currentDateNum > 0 && endDateNum - currentDateNum < 7) {
return beginDate + "~" + sdf.format(new Date());
}
return beginDate + "~" + endDate;
}
/**
* 获取每年第一天是星期几
*
* @param year
* @return
*/
private static int getFirstDayWeekDay(int year) {
Calendar cal = Calendar.getInstance();
cal.set(year, 0, 1);
return cal.get(Calendar.DAY_OF_WEEK);
}
执行结果:
2. 根据当前年的第几月,获取日期时间段
public static void main(String[] args) {
String timeInterval = getTimeIntervalByMonthNo("2023-08");
System.out.println(timeInterval);
}
/**
* 获取月份时间段
*
* @param time
* @return
*/
private static String getTimeIntervalByMonthNo(String time) {
String beginDate = time + "-01";
String year = time.split("-")[0];
String month = time.split("-")[1];
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, Integer.parseInt(year));
//Calendar里的月是从0开始,要-1
cal.set(Calendar.MONTH, Integer.parseInt(month) - 1);
//日,设为一号
cal.set(Calendar.DATE, 1);
//月份加一,得到下个月的一号
cal.add(Calendar.MONTH, 1);
//下一个月减一为本月最后一天
cal.add(Calendar.DATE, -1);
//获得月末是几号
String monthEnd = String.valueOf(cal.get(Calendar.DAY_OF_MONTH));
String endDate = time + "-" + monthEnd;
int currentDateNum = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
int endDateNum = Integer.parseInt(endDate.replace("-", ""));
if (endDateNum - currentDateNum > 0 && endDateNum - currentDateNum < Integer.parseInt(monthEnd)) {
return beginDate + "~" + new SimpleDateFormat("yyyy-MM-dd").format(new Date());
}
return beginDate + "~" + endDate;
}
执行结果:
3. 根据年份,获取日期时间段(如果当前日期处于当前年中,则结束日期取当前日期)
public static void main(String[] args) {
String timeInterval = getTimeIntervalByYearNo("2023-08");
System.out.println(timeInterval);
}
/**
* 获取年份时间段
*
* @param time
* @return
*/
private static String getTimeIntervalByYearNo(String time) {
String beginDate = time + "-01-01";
String endDate = time + "-12-31";
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
int currentYearNum = Integer.parseInt(sdf.format(new Date()));
int endDateNumber = Integer.parseInt(endDate.replace("-", ""));
if (endDateNumber - currentYearNum > 0) {
return beginDate + "~" + new SimpleDateFormat("yyyy-MM-dd").format(new Date());
}
return beginDate + "~" + endDate;
}
执行结果:
4. 获取指定日期在指定年的第几周(已解决跨年问题)
public static void main(String[] args) {
String timeInterval = getWeekOfYear("2023-01-01");
System.out.println(timeInterval);
}
/**
* 获取指定日期在指定年的第几周
*
* @param createTime
* @return
* @throws ParseException
*/
private static String getWeekOfYear(String createTime) {
try {
Calendar calendar = Calendar.getInstance();
//设置星期一为一周开始的第一天
calendar.setFirstDayOfWeek(Calendar.MONDAY);
calendar.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(createTime));
calendar.setMinimalDaysInFirstWeek(7);
//获得当前日期属于今年的第几周
int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR);
// 解决跨年问题,年初不足7天的,且第一个星期一之前的天数不足4天,当前日期比第一个星期一小,算上一年的最后一周;一个星期一之前的天数超过4天,当前日期比第一个星期一小,算今年的第一周
if (createTime.compareTo(getFirstMonday(createTime)) < 0 && Integer.parseInt(getFirstMonday(createTime).replace("-","")) - Integer.parseInt(getYear(createTime) + "0101") <= 3) {
calendar.add(Calendar.DATE, -7);
weekOfYear = weekOfYear + 1;
} else if (Integer.parseInt(getFirstMonday(createTime).replace("-","")) - Integer.parseInt(getYear(createTime) + "0101") > 3) {
calendar.add(Calendar.DATE, 7);
weekOfYear = 1;
}
int year = calendar.get(Calendar.YEAR);
return year + String.format("%02d", weekOfYear);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
/**
* 获取当前年第一个星期一的日期
*
* @param createTime
* @return
* @throws ParseException
*/
private static String getFirstMonday(String createTime) throws ParseException {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.MONTH, 0);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(createTime));
while (calendar.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
// 循环直到找到第一个星期一
calendar.add(Calendar.DAY_OF_MONTH, 1);
}
return new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime());
}
执行结果:
202252表示2022年的第52周
代码做了跨年处理,在年初第一个星期一之前的日期,算上一年的最后一周,在第一个星期一之后的日期,算当年的第一周
希望能够帮助到大家,欢迎评论(●’◡’●)