You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

68 lines
2.6 KiB

package cn.teammodel.utils;
import cn.teammodel.model.entity.school.Semester;
import java.time.LocalDate;
import java.util.Comparator;
import java.util.List;
/**
* ,,
* @author winter
* @create 2023-11-28 10:15
*/
public class SchoolDateUtil {
/**
*
* :
* <pre>
* "semesters": [
* {
* "name": "下学期",
* "start": 0,
* "month": 3,
* "day": 1,
* "id": "2"
* },
* {
* "name": "上学期",
* "start": 1,
* "month": 9,
* "day": 1,
* "id": "1"
* }
* <pre/>
* <p>
* : 2023.11.28 2023
* : -> 2024.1.1, 2023,,semesters
* </p>
*/
public static String getSemesterByNow(List<Semester> semesters, LocalDate date) {
if (semesters == null || semesters.isEmpty() || date == null) {
throw new IllegalArgumentException("Invalid input: semesters and date must not be null or empty.");
}
// 将 semester 根据大小排序
semesters.sort(Comparator.comparing(s -> LocalDate.of(date.getYear(), s.getMonth(), s.getDay())));
// i = 0 的日期是开学最早, i = size - 1 是开学最晚
int size = semesters.size();
// 拿到最晚开学的日期,将年份 - 1后,与头节点组成可跨年区间
Semester lastSemester = semesters.get(size - 1);
LocalDate tmpSemester = LocalDate.of(date.getYear() - 1, lastSemester.getMonth(), lastSemester.getDay());
for (Semester semester : semesters) {
// 特判头尾的提起,分别将学期区间提前和延后一年(不用延后),例如 2023.3.1 与 2023.9.1 我们分别向添加一个节点,划分其为 3 个区间:
// 2022.9.1 - 2023.3.1, 2023.3.1 - 2023.9.1, 2023.9.1 - 2024.3.1
LocalDate curSemester = LocalDate.of(date.getYear(), semester.getMonth(), semester.getDay());
if (date.isEqual(tmpSemester) || date.isAfter(tmpSemester) && date.isBefore(curSemester)) {
return tmpSemester.toString();
}
tmpSemester = curSemester;
}
// 剩下的时间段, 学年应该就是最后一个学年
return LocalDate.of(date.getYear(), lastSemester.getMonth(), lastSemester.getDay()).toString();
}
}