|
@@ -1,5 +1,7 @@
|
|
|
package cn.iocoder.yudao.module.iscs.utils;
|
|
package cn.iocoder.yudao.module.iscs.utils;
|
|
|
|
|
|
|
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
+
|
|
|
import java.time.DayOfWeek;
|
|
import java.time.DayOfWeek;
|
|
|
import java.time.LocalDate;
|
|
import java.time.LocalDate;
|
|
|
import java.time.YearMonth;
|
|
import java.time.YearMonth;
|
|
@@ -12,7 +14,6 @@ public class SuperDateUtils {
|
|
|
private static final DateTimeFormatter YYYYMMDD = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
private static final DateTimeFormatter YYYYMMDD = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
|
// ------------------------------------- 获取指定时间段内的所有日期 ---------------------------------------------------
|
|
// ------------------------------------- 获取指定时间段内的所有日期 ---------------------------------------------------
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -129,6 +130,7 @@ public class SuperDateUtils {
|
|
|
}*/
|
|
}*/
|
|
|
|
|
|
|
|
// ---------------------------------- 获取指定时间段内的所有指定号日期 -----------------------------------------------------
|
|
// ---------------------------------- 获取指定时间段内的所有指定号日期 -----------------------------------------------------
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 根据时间段和指定日期中的“日”部分,获取所有匹配的日期。
|
|
* 根据时间段和指定日期中的“日”部分,获取所有匹配的日期。
|
|
|
*
|
|
*
|
|
@@ -183,8 +185,9 @@ public class SuperDateUtils {
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 获取指定时间段内每月的第指定天数的日期。
|
|
* 获取指定时间段内每月的第指定天数的日期。
|
|
|
- * @param startStr 起始日期字符串,格式为yyyy-MM-dd
|
|
|
|
|
- * @param endStr 结束日期字符串,格式为yyyy-MM-dd
|
|
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param startStr 起始日期字符串,格式为yyyy-MM-dd
|
|
|
|
|
+ * @param endStr 结束日期字符串,格式为yyyy-MM-dd
|
|
|
* @param dayOfMonth 每月的第几天(如1表示每月1日)
|
|
* @param dayOfMonth 每月的第几天(如1表示每月1日)
|
|
|
* @return 符合条件的日期列表
|
|
* @return 符合条件的日期列表
|
|
|
* java帮我写一个帮助类 可以通过传入时间段 获取指定每月第多少天的日期 如输入2025-08-23,2025-10-25,1,输出2025-09-01和2025-10-01,如果超过每月天数 如输入第天31天,则输出2025-09-30和2025-10-31
|
|
* java帮我写一个帮助类 可以通过传入时间段 获取指定每月第多少天的日期 如输入2025-08-23,2025-10-25,1,输出2025-09-01和2025-10-01,如果超过每月天数 如输入第天31天,则输出2025-09-30和2025-10-31
|
|
@@ -241,8 +244,10 @@ public class SuperDateUtils {
|
|
|
}*/
|
|
}*/
|
|
|
|
|
|
|
|
// ---------------------------------------- 根据输入的年月获取相邻的前后月份 -----------------------------------------
|
|
// ---------------------------------------- 根据输入的年月获取相邻的前后月份 -----------------------------------------
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 根据输入的年月获取相邻的前后月份。
|
|
* 根据输入的年月获取相邻的前后月份。
|
|
|
|
|
+ *
|
|
|
* @param yearMonthStr 输入的年月字符串,格式为"yyyy-MM"
|
|
* @param yearMonthStr 输入的年月字符串,格式为"yyyy-MM"
|
|
|
* @return 包含前一个月和后一个月的列表,格式为["yyyy-MM", "yyyy-MM"]
|
|
* @return 包含前一个月和后一个月的列表,格式为["yyyy-MM", "yyyy-MM"]
|
|
|
* java帮我写一个帮助类 可以通过传入月份 获取相邻月份数据 如输入2025-08,输出2025-07和2025-09
|
|
* java帮我写一个帮助类 可以通过传入月份 获取相邻月份数据 如输入2025-08,输出2025-07和2025-09
|
|
@@ -274,4 +279,76 @@ public class SuperDateUtils {
|
|
|
System.out.println(getAdjacentMonths("2025-12")); // [2025-11, 2026-01]
|
|
System.out.println(getAdjacentMonths("2025-12")); // [2025-11, 2026-01]
|
|
|
}*/
|
|
}*/
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+ // ------------------------------------------根据频率,当前时间和指定的第多少年去获取最近的3条数据
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 计算最近多次符合条件的日期
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param effectiveDateStr 生效日期,格式yyyy-MM-dd
|
|
|
|
|
+ * @param frequencyYears 频率(年数)
|
|
|
|
|
+ * @param dayOfYear 第几天(从1开始)
|
|
|
|
|
+ * @param count 输出后面多少个数据
|
|
|
|
|
+ * @param endDateStr 截至日期,格式yyyy-MM-dd
|
|
|
|
|
+ * @return 最近多次的日期字符串数组,格式yyyy-MM-dd
|
|
|
|
|
+ */
|
|
|
|
|
+ public static List<String> getAdjacentDates(String effectiveDateStr, int frequencyYears, int dayOfYear, int count, String endDateStr) {
|
|
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
|
|
|
+ LocalDate effectiveDate = LocalDate.parse(effectiveDateStr, formatter);
|
|
|
|
|
+ int baseYear = effectiveDate.getYear();
|
|
|
|
|
+
|
|
|
|
|
+ // 获取基准年份的有效日期(自动调整非法天数)
|
|
|
|
|
+ LocalDate validDateInBaseYear = getValidDateForYear(baseYear, dayOfYear);
|
|
|
|
|
+ List<String> result = new ArrayList<>();
|
|
|
|
|
+
|
|
|
|
|
+ // 添加基准年份日期(需满足不早于生效日期)
|
|
|
|
|
+ if (!validDateInBaseYear.isBefore(effectiveDate)) {
|
|
|
|
|
+ result.add(validDateInBaseYear.format(formatter));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 初始化当前年份为基准年 + 频率年数
|
|
|
|
|
+ int currentYear = baseYear + frequencyYears;
|
|
|
|
|
+
|
|
|
|
|
+ // 持续生成后续日期,直到达到指定数量或超出截止日期
|
|
|
|
|
+ while (result.size() < count) {
|
|
|
|
|
+ LocalDate targetDate = getValidDateForYear(currentYear, dayOfYear);
|
|
|
|
|
+ // 检查是否超过截止日期(如果有)
|
|
|
|
|
+ if (endDateStr != null) {
|
|
|
|
|
+ LocalDate endDate = LocalDate.parse(endDateStr, formatter);
|
|
|
|
|
+ if (targetDate.isAfter(endDate)) {
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ // 确保日期在生效日期之后
|
|
|
|
|
+ if (targetDate.isAfter(effectiveDate)) {
|
|
|
|
|
+ result.add(targetDate.format(formatter));
|
|
|
|
|
+ } else {
|
|
|
|
|
+ break; // 无更多有效日期
|
|
|
|
|
+ }
|
|
|
|
|
+ currentYear += frequencyYears; // 按频率递增年份
|
|
|
|
|
+ }
|
|
|
|
|
+ List<String> list = result.subList(0, Math.min(count, result.size()));
|
|
|
|
|
+ if (StringUtils.isNotBlank(endDateStr)) {
|
|
|
|
|
+ list.removeIf(item -> LocalDate.parse(item, formatter).isAfter(LocalDate.parse(endDateStr, formatter)));
|
|
|
|
|
+ }return list;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private static LocalDate getValidDateForYear(int year, int dayOfYear) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ return LocalDate.ofYearDay(year, dayOfYear);
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ // 自动调整到该年最后一天
|
|
|
|
|
+ int maxDay = LocalDate.of(year, 12, 31).lengthOfYear();
|
|
|
|
|
+ return LocalDate.ofYearDay(year, maxDay);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static void main(String[] args) {
|
|
|
|
|
+ // 示例测试:查找2025-07-24之后,每年第250天的日期,最多10个
|
|
|
|
|
+ List<String> dates = getAdjacentDates("2025-07-24", 1, 206, 10, "2029-07-24");
|
|
|
|
|
+ System.out.println("结果:" + dates);
|
|
|
|
|
+ // 预期输出应包含2028-09-07(若250天合法)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
}
|
|
}
|