依赖:
- 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));}}
