依赖:

    1. package cn.mrcode.date;
    2. import cn.hutool.core.date.DateTime;
    3. import cn.hutool.core.date.DateUtil;
    4. import java.time.LocalDate;
    5. import java.util.Arrays;
    6. import java.util.Date;
    7. /**
    8. * @author mrcode
    9. * @date 2022/6/23 13:42
    10. */
    11. public final class DateUtils {
    12. public final static String P_YYYYMMDD = "yyyyMMdd";
    13. /**
    14. * 获取最近 n 周的日期(不包含本周),返回的日期包含头尾,比如 2022-06-20 00:00:00 和 2022-06-26 23:59:59
    15. */
    16. public static Date[] lastWeek(int n) {
    17. return lastWeek(n, null);
    18. }
    19. /**
    20. * 获取最近 n 周的日期(不包含本周),返回的日期包含头尾,比如 2022-06-20 00:00:00 和 2022-06-26 23:59:59
    21. *
    22. * @param n
    23. * @param now 以该时间作为当前时间计算, 如果为 null 则按照 new Date() 作为当前时间
    24. * @return
    25. */
    26. public static Date[] lastWeek(int n, Date now) {
    27. DateTime lastWeek;
    28. if (now == null) {
    29. lastWeek = DateUtil.lastWeek();
    30. } else {
    31. lastWeek = DateUtil.offsetWeek(now, -1);
    32. }
    33. // 获取上一周的开始和结束日期
    34. DateTime startTime = DateUtil.beginOfWeek(lastWeek);
    35. DateTime endTime = DateUtil.endOfWeek(lastWeek);
    36. if (n > 1) {
    37. startTime = DateUtil.offsetWeek(startTime, -(n - 1));
    38. }
    39. return new Date[]{startTime.toJdkDate(), endTime.toJdkDate()};
    40. }
    41. /**
    42. * 获取最近 n 周的日期(不包含本周),返回的日期包含头尾,比如 2022-06-20 和 2022-06-26
    43. *
    44. * @param n
    45. * @return
    46. */
    47. public static LocalDate[] lastWeekLocalDate(int n) {
    48. return lastWeekLocalDate(n, null);
    49. }
    50. /**
    51. * 获取最近 n 周的日期(不包含本周),返回的日期包含头尾,比如 2022-06-20 和 2022-06-26
    52. *
    53. * @param n
    54. * @param now 以指定时间作为当前时间
    55. * @return
    56. */
    57. public static LocalDate[] lastWeekLocalDate(int n, LocalDate now) {
    58. Date nowDate = null;
    59. if (now != null) {
    60. nowDate = Jdk8DateUtil.localDateToDate(now);
    61. }
    62. Date[] dates = lastWeek(n, nowDate);
    63. return new LocalDate[]{
    64. Jdk8DateUtil.dateToLocalDate(dates[0]),
    65. Jdk8DateUtil.dateToLocalDate(dates[1])
    66. };
    67. }
    68. /**
    69. * 获取最近 n 个月(包含当月),返回的日期包含头尾,比如 2022-05-01 00:00:00 和 2022-06-01 00:00:00
    70. */
    71. public static Date[] lastMonth(int n) {
    72. return lastMonth(n, false);
    73. }
    74. /**
    75. * 获取最近 n 个月,返回的日期包含头尾,比如 2022-05-01 00:00:00 和 2022-06-01 00:00:00
    76. *
    77. * @param n
    78. * @param notCurrentMonth 是否包含当月
    79. * @return
    80. */
    81. public static Date[] lastMonth(int n, boolean notCurrentMonth) {
    82. final DateTime endMonthTime = DateUtil.beginOfMonth(notCurrentMonth ? DateUtil.lastMonth() : new Date());
    83. if (n < 2) {
    84. return new Date[]{endMonthTime.toJdkDate()};
    85. }
    86. DateTime startMonthTime = DateUtil.offsetMonth(endMonthTime, -(n - 1));
    87. return new Date[]{startMonthTime.toJdkDate(), endMonthTime.toJdkDate()};
    88. }
    89. /**
    90. * 获取最近 n 个月(包含当月),返回的日期包含头尾,比如 2022-05-01 和 2022-06-01
    91. */
    92. public static LocalDate[] lastMonthLocalDate(int n) {
    93. return lastMonthLocalDate(n, false);
    94. }
    95. /**
    96. * 获取最近 n 个月,返回的日期包含头尾,比如 2022-05-01 00:00:00 和 2022-06-01 00:00:00
    97. *
    98. * @param n
    99. * @param notCurrentMonth 是否包含当月
    100. * @return
    101. */
    102. public static LocalDate[] lastMonthLocalDate(int n, boolean notCurrentMonth) {
    103. final Date[] dates = lastMonth(n, notCurrentMonth);
    104. if (dates.length == 1) {
    105. return new LocalDate[]{
    106. Jdk8DateUtil.dateToLocalDate(dates[0])
    107. };
    108. }
    109. return new LocalDate[]{
    110. Jdk8DateUtil.dateToLocalDate(dates[0]),
    111. Jdk8DateUtil.dateToLocalDate(dates[1])
    112. };
    113. }
    114. /**
    115. * 将时间转化为 yyyyMMdd 的数值格式
    116. *
    117. * @param date
    118. * @return
    119. */
    120. public static int dateToDayInt(Date date) {
    121. return Integer.valueOf(DateUtil.format(date, P_YYYYMMDD));
    122. }
    123. public static int dateToDayInt(LocalDate date) {
    124. return dateToDayInt(Jdk8DateUtil.localDateToDate(date));
    125. }
    126. /**
    127. * 将时间转化为 yyyyweek 的数值格式 比如 2022-06-26 是 202226 2022 年第 26 周
    128. *
    129. * @param date
    130. * @return
    131. */
    132. public static int dateToWeekInt(Date date) {
    133. return dateToWeekInt(Jdk8DateUtil.dateToLocalDate(date));
    134. }
    135. public static int dateToWeekInt(LocalDate date) {
    136. return Jdk8DateUtil.dateToWeekInt(date);
    137. }
    138. /**
    139. * 将时间转化为 yyyymm,从 1 开始
    140. *
    141. * @param date
    142. * @return
    143. */
    144. public static int dateToMonthInt(Date date) {
    145. return Integer.valueOf(DateUtil.format(date, "yyyyMM"));
    146. }
    147. public static int dateToMonthInt(LocalDate startDay) {
    148. return dateToMonthInt(Jdk8DateUtil.localDateToDate(startDay));
    149. }
    150. }