js自定义月的按日期的方法, (间隔几个月,的几号,重复)复制就能用

文章介绍了如何使用JavaScript函数getNextCustomDate,该函数可以根据指定的月份数、日期数组、起始日期、是否跳过周末和法定假日,找出符合条件的显示日期。它涉及到节日判断、日期格式化和逻辑处理。
摘要由CSDN通过智能技术生成

用法 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 '未找到有效日期';
	}
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值