前段校验
vue2
const isOverlap = record.dateRangeList.some((range, i) => {
if (i === index || !range.startDate || !range.endDate) return false;
// 转换为时间戳便于比较
const existingStart = new Date(range.startDate).getTime();
const existingEnd = new Date(range.endDate).getTime();
const newStart = new Date(newStartDate).getTime();
const newEnd = new Date(newEndDate).getTime();
// 判断时间重叠条件
return (newStart < existingEnd && newEnd > existingStart);
});
dataRangeList的结构是
[{startTime:"xxxx-xx-xx",endTime:"xxxx-xx-xx"},{startTime:"xxxx-xx-xx",endTime:"xxxx-xx-xx"},……]
后端校验
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@Data
public class DateRange {
@ApiModelProperty(value = "起始时间")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
private Date startDate;
@ApiModelProperty(value = "结束时间")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
private Date endDate;
}
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.ArrayList;
public class DateRangeValidator {
/**
* 检查给定的日期范围列表是否有任何重叠。
*
* @param dateRangeList 日期范围列表
* @return 如果没有重叠返回true,否则返回false
*/
public static boolean checkForOverlaps(List<DateRange> dateRangeList) {
if (CollectionUtils.isEmpty(dateRangeList)) {
return true; // 空列表默认无重叠
}
List<DateRange> sortedRanges = new ArrayList<>(dateRangeList);
// 根据起始时间排序
sortedRanges.sort((range1, range2) -> range1.getStartDate().compareTo(range2.getStartDate()));
for (int i = 0; i < sortedRanges.size() - 1; i++) {
DateRange current = sortedRanges.get(i);
DateRange next = sortedRanges.get(i + 1);
// 检查当前区间是否和下一个区间重叠
if (current.getEndDate().after(next.getStartDate()) || current.getEndDate().equals(next.getStartDate())) {
return false; // 发现重叠
}
}
return true; // 没有发现重叠
}
/**
* 添加新的日期范围到列表,并检查是否有重叠。
*
* @param activityItemUser 包含日期范围列表的对象
* @param newDateRange 新的日期范围
* @return 如果成功添加且无重叠返回true,否则返回false
*/
public static boolean addDateRangeWithoutOverlap(ActivityItemUser activityItemUser, DateRange newDateRange) {
List<DateRange> dateRangeList = activityItemUser.getDateRangeList();
if (dateRangeList == null) {
dateRangeList = new ArrayList<>();
activityItemUser.setDateRangeList(dateRangeList);
}
// 先将新的日期范围添加到列表中
dateRangeList.add(newDateRange);
// 检查重叠情况
if (!checkForOverlaps(dateRangeList)) {
// 若有重叠则移除刚刚添加的时间段并返回false
dateRangeList.remove(newDateRange);
return false;
}
return true;
}
}