依赖:
- hutool:
implementation 'cn.hutool:hutool-all:5.8.3'
- JDK8 日期类相关使用:自建文件
package cn.mrcode.date;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.Date;
/**
* @author mrcode
* @date 2022/6/23 13:42
*/
public final class DateUtils {
public final static String P_YYYYMMDD = "yyyyMMdd";
/**
* 获取最近 n 周的日期(不包含本周),返回的日期包含头尾,比如 2022-06-20 00:00:00 和 2022-06-26 23:59:59
*/
public static Date[] lastWeek(int n) {
return lastWeek(n, null);
}
/**
* 获取最近 n 周的日期(不包含本周),返回的日期包含头尾,比如 2022-06-20 00:00:00 和 2022-06-26 23:59:59
*
* @param n
* @param now 以该时间作为当前时间计算, 如果为 null 则按照 new Date() 作为当前时间
* @return
*/
public static Date[] lastWeek(int n, Date now) {
DateTime lastWeek;
if (now == null) {
lastWeek = DateUtil.lastWeek();
} else {
lastWeek = DateUtil.offsetWeek(now, -1);
}
// 获取上一周的开始和结束日期
DateTime startTime = DateUtil.beginOfWeek(lastWeek);
DateTime endTime = DateUtil.endOfWeek(lastWeek);
if (n > 1) {
startTime = DateUtil.offsetWeek(startTime, -(n - 1));
}
return new Date[]{startTime.toJdkDate(), endTime.toJdkDate()};
}
/**
* 获取最近 n 周的日期(不包含本周),返回的日期包含头尾,比如 2022-06-20 和 2022-06-26
*
* @param n
* @return
*/
public static LocalDate[] lastWeekLocalDate(int n) {
return lastWeekLocalDate(n, null);
}
/**
* 获取最近 n 周的日期(不包含本周),返回的日期包含头尾,比如 2022-06-20 和 2022-06-26
*
* @param n
* @param now 以指定时间作为当前时间
* @return
*/
public static LocalDate[] lastWeekLocalDate(int n, LocalDate now) {
Date nowDate = null;
if (now != null) {
nowDate = Jdk8DateUtil.localDateToDate(now);
}
Date[] dates = lastWeek(n, nowDate);
return new LocalDate[]{
Jdk8DateUtil.dateToLocalDate(dates[0]),
Jdk8DateUtil.dateToLocalDate(dates[1])
};
}
/**
* 获取最近 n 个月(包含当月),返回的日期包含头尾,比如 2022-05-01 00:00:00 和 2022-06-01 00:00:00
*/
public static Date[] lastMonth(int n) {
return lastMonth(n, false);
}
/**
* 获取最近 n 个月,返回的日期包含头尾,比如 2022-05-01 00:00:00 和 2022-06-01 00:00:00
*
* @param n
* @param notCurrentMonth 是否包含当月
* @return
*/
public static Date[] lastMonth(int n, boolean notCurrentMonth) {
final DateTime endMonthTime = DateUtil.beginOfMonth(notCurrentMonth ? DateUtil.lastMonth() : new Date());
if (n < 2) {
return new Date[]{endMonthTime.toJdkDate()};
}
DateTime startMonthTime = DateUtil.offsetMonth(endMonthTime, -(n - 1));
return new Date[]{startMonthTime.toJdkDate(), endMonthTime.toJdkDate()};
}
/**
* 获取最近 n 个月(包含当月),返回的日期包含头尾,比如 2022-05-01 和 2022-06-01
*/
public static LocalDate[] lastMonthLocalDate(int n) {
return lastMonthLocalDate(n, false);
}
/**
* 获取最近 n 个月,返回的日期包含头尾,比如 2022-05-01 00:00:00 和 2022-06-01 00:00:00
*
* @param n
* @param notCurrentMonth 是否包含当月
* @return
*/
public static LocalDate[] lastMonthLocalDate(int n, boolean notCurrentMonth) {
final Date[] dates = lastMonth(n, notCurrentMonth);
if (dates.length == 1) {
return new LocalDate[]{
Jdk8DateUtil.dateToLocalDate(dates[0])
};
}
return new LocalDate[]{
Jdk8DateUtil.dateToLocalDate(dates[0]),
Jdk8DateUtil.dateToLocalDate(dates[1])
};
}
/**
* 将时间转化为 yyyyMMdd 的数值格式
*
* @param date
* @return
*/
public static int dateToDayInt(Date date) {
return Integer.valueOf(DateUtil.format(date, P_YYYYMMDD));
}
public static int dateToDayInt(LocalDate date) {
return dateToDayInt(Jdk8DateUtil.localDateToDate(date));
}
/**
* 将时间转化为 yyyyweek 的数值格式 比如 2022-06-26 是 202226 2022 年第 26 周
*
* @param date
* @return
*/
public static int dateToWeekInt(Date date) {
return dateToWeekInt(Jdk8DateUtil.dateToLocalDate(date));
}
public static int dateToWeekInt(LocalDate date) {
return Jdk8DateUtil.dateToWeekInt(date);
}
/**
* 将时间转化为 yyyymm,从 1 开始
*
* @param date
* @return
*/
public static int dateToMonthInt(Date date) {
return Integer.valueOf(DateUtil.format(date, "yyyyMM"));
}
public static int dateToMonthInt(LocalDate startDay) {
return dateToMonthInt(Jdk8DateUtil.localDateToDate(startDay));
}
}