用法
skipMonths
间隔月,modifiedArray
都几号显示为数组,formattedDate
开始日期创建日期,isWeekends
是否跳过周末,isSkipHoliday
是否跳过法定假日
//用法
cgetNextCustomDate(skipMonths, modifiedArray, formattedDate, isWeekends, isSkipHoliday)
// getNextCustomDate(2, [11,17,19], '2024-03-13',true,true)
这是需要的另外的函数
// 法定节假日
function isHolidayChina(dateString) {
// 从缓存中取出日历信息
let holidays = JSON.parse(uni.getStorageSync('holidaysArray')); //接口获取的
holidays.push(20240429); //为了测试法定节假日
const [year, month, day] = dateString.split('-').map(Number);
const currentDate = parseInt(`${year}${month < 10 ? '0' + month : month}${day < 10 ? '0' + day : day}`);
return holidays.includes(currentDate);
}
// 格式化日期为 YYYY-MM-DD
function formatDate(date) {
const year = date.getFullYear();
const month = (date.getMonth() + 1).toString().padStart(2, '0');
const day = date.getDate().toString().padStart(2, '0');
return `${year}-${month}-${day}`;
}
这是主方法,直接调用这个就可以
// 自定义间隔skipMonths个月的那几天显示(按日期)的方法
function getNextCustomDate(skipMonths, datesArray, startDate, isWeekends, isSkipHoliday) {
var start = new Date(startDate);
var today = new Date();
today.setHours(0, 0, 0, 0);
datesArray.sort((a, b) => a - b);
function formatDate(date) {
return date.getFullYear() + '-' + ('0' + (date.getMonth() + 1)).slice(-2) + '-' + ('0' + date.getDate()).slice(-
2);
}
function isHolidayAdapted(date) {
let formattedDate = formatDate(date);
return isHolidayChina(formattedDate); // 假设isHolidayChina是您定义的函数
}
function findNextValidDate(startDate, skipMonths, isWeekends, isSkipHoliday, datesArray) {
let tempDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate()); // 初始设置为开始日期
// 计算跳过月份后的月份是否与当前月份一致,或为间隔的倍数
let monthsDifference = tempDate.getMonth() - start.getMonth() + (12 * (tempDate.getFullYear() - start
.getFullYear()));
let isInInterval = skipMonths === 0 || monthsDifference % skipMonths === 0;
if (!isInInterval) {
// 不在间隔内,调整到下一个符合间隔的月份
let additionalMonths = skipMonths - (monthsDifference % skipMonths);
tempDate.setMonth(tempDate.getMonth() + additionalMonths);
tempDate.setDate(1); // 设置为月初避免日溢出
}
do {
for (let i = 0; i < datesArray.length; i++) {
let day = datesArray[i];
tempDate.setDate(day); // 设置为优选日子
let tempDateDayOfWeek = tempDate.getDay();
// 判断日期是否在今天或今天之后
if (tempDate < today) continue; // 如果日期已过,继续检查下一个日期
// 检查是否为周末和节假日
if ((!isWeekends || (tempDateDayOfWeek !== 0 && tempDateDayOfWeek !== 6)) &&
(!isSkipHoliday || !isHolidayAdapted(tempDate))) {
// 找到符合条件的日期
return tempDate;
}
}
// 未找到有效日期,跳到下一个间隔月份
tempDate.setMonth(tempDate.getMonth() + skipMonths);
tempDate.setDate(1); // 重置为月初,避免日期溢出
} while (tempDate.getFullYear() < today.getFullYear() + 10); // 避免无限循环
// 如果代码执行到这里,表示未找到有效日期
return null;
}
var targetDate = findNextValidDate(start, skipMonths, isWeekends, isSkipHoliday, datesArray);
if (targetDate) {
return formatDate(targetDate);
} else {
return '未找到有效日期';
}
}