vue3使用<el-date-picker分别设置开始时间和结束时间时,设置开始时间晚于当前时间,开始时间早于结束时间,结束时间晚于开始时间

vue3使用<el-date-picker分别设置开始时间和结束时间时,设置开始时间晚于当前时间,开始时间早于结束时间,结束时间晚于开始时间

为避免出现填写结束事件后再次修改开始时间,导致开始时间晚于结束时间,添加 @change="handleChangeStartTime"

进一步进行时间校验

javascript 复制代码
<el-date-picker
	v-else-if="item.type === 'datetimestart'"
	v-model="state.ruleForm[item.key]"
	type="datetime"
	format="YYYY-MM-DD HH:mm:ss"
	time-format="HH:mm:ss"
	value-format="YYYY-MM-DD HH:mm:ss"
	v-bind="pickerOptions"
	placeholder="选择日期时间"
	@change="handleChangeStartTime"
>
</el-date-picker>
<el-date-picker
	v-else-if="item.type === 'datetimeend'"
	v-model="state.ruleForm[item.key]"
	type="datetime"
	format="YYYY-MM-DD HH:mm:ss"
	time-format="HH:mm:ss"
	value-format="YYYY-MM-DD HH:mm:ss"
	v-bind="pickerOptionsEnd"
	placeholder="选择日期时间"
>
</el-date-picker>
javascript 复制代码
const handleChangeStartTime = () => {
		const startTime = convertToTimestamp(state.ruleForm.planStartTime);
		const endTime = convertToTimestamp(state.ruleForm.planEndTime);
		if (startTime > endTime) {
			ElMessage.warning('计划开始时间晚于计划结束时间,请重新添加计划开始时间或计划结束时间');
		}
	};
	/**
	 * 生成一个数组
	 * @param start
	 * @param end
	 */
	const makeRange = (start: number, end: number) => {
		const result: number[] = [];
		for (let i = start; i <= end; i++) {
			result.push(i);
		}
		return result;
	};

	/**
	 * 限制今天之前的时间不能选择(小时)
	 */
	const disabledHours = () => {
		let newVal = new Date(state.ruleForm.planStartTime);
		if (
			newVal &&
			newVal.getFullYear() == new Date().getFullYear() &&
			newVal.getMonth() == new Date().getMonth() &&
			newVal.getDate() == new Date().getDate()
		) {
			//如果为今天,则限制当前时间前的时间不能选择。
			return makeRange(0, new Date().getHours());
		}
	};

	/**
	 * 限制今天之前的时间不能选择(分钟)
	 * @param hour
	 */
	const disabledMinutes = () => {
		let newVal = new Date(state.ruleForm.planStartTime);

		if (
			newVal &&
			newVal.getFullYear() == new Date().getFullYear() &&
			newVal.getMonth() == new Date().getMonth() &&
			newVal.getDate() == new Date().getDate() &&
			newVal.getHours() == new Date().getHours()
		) {
			//如果为今天,则限制当前时间前的时间不能选择。
			return makeRange(0, new Date().getMinutes() - 1);
		}
	};

	/**
	 * 限制今天之前的时间不能选择的配置
	 */
	const pickerOptions = computed(() => {
		return {
			// 限制今天之前的日期不能选择
			disabledDate(time: any) {
				return time.getTime() < Date.now() - 8.64e7;
			},
			// 限制今天之前的小时不能选择
			disabledHours,
			// 限制今天之前的分钟不能选择
			disabledMinutes,
		};
	});

	// 结束时间
	const pickerOptionsEnd = computed(() => {
		return {
			// 限制开始时间之前的日期不能选择
			disabledDate(time: any) {
				return time.getTime() < convertToTimestamp(state.ruleForm.planStartTime) - 8.64e7;
			},
			// 限制开始时间之前的小时不能选择
			disabledHours() {
				let newVal = new Date(state.ruleForm.planEndTime);
				const time = state.ruleForm.planStartTime;

				if (
					newVal &&
					newVal.getFullYear() == new Date(time).getFullYear() &&
					newVal.getMonth() == new Date(time).getMonth() &&
					newVal.getDate() == new Date(time).getDate()
				) {
					//限制开始时间前的时间不能选择。
					return makeRange(0, new Date(time).getHours() - 1);
				}
			},
			// 限制开始时间之前的分钟不能选择
			disabledMinutes() {
				let newVal = new Date(state.ruleForm.planEndTime);
				const time = state.ruleForm.planStartTime;
				if (
					newVal &&
					newVal.getFullYear() == new Date(time).getFullYear() &&
					newVal.getMonth() == new Date(time).getMonth() &&
					newVal.getDate() == new Date(time).getDate() &&
					newVal.getHours() == new Date(time).getHours()
				) {
					//限制开始时间前的时间不能选择。
					return makeRange(0, new Date(time).getMinutes() - 1);
				}
			},
			disabledSeconds() {
				let newVal = new Date(state.ruleForm.planEndTime);
				const time = state.ruleForm.planStartTime;

				if (
					newVal &&
					newVal.getFullYear() == new Date(time).getFullYear() &&
					newVal.getMonth() == new Date(time).getMonth() &&
					newVal.getDate() == new Date(time).getDate() &&
					newVal.getHours() == new Date(time).getHours() &&
					newVal.getMinutes() == new Date(time).getMinutes()
				) {
					//限制开始时间前的时间不能选择。
					return makeRange(0, new Date(time).getSeconds());
				}
				// return makeRange(0, new Date(time).getSeconds() - 1);
			},
		};
	});
	/**
	 * 将某个时间转化成时间戳
	 * 时间格式:2019-05-20 00:00:00 或 2019年5月1日 00:00:00
	 * 返回值:1556640000000,13位时间戳
	 */
	// 示例日期字符串格式:"2023-05-15 14:30:00"
	function convertToTimestamp(dateString: string) {
		// 处理iOS兼容性问题(将短横线替换为斜杠)
		const formattedDate = dateString.replace(/-/g, '/');
		const dateObj = new Date(formattedDate);
		return dateObj.getTime(); // 返回13位时间戳(毫秒级)
	}
相关推荐
酷爱码3 分钟前
好看的个人主页HTML源码分享
前端·html
三思而后行,慎承诺18 分钟前
react的fiber 用法
前端·javascript·react.js
Deepsleep.36 分钟前
前端性能优化面试回答技巧
前端·面试·性能优化
阿伟来咯~1 小时前
vue3+Nest.js项目 部署阿里云
开发语言·javascript·ecmascript
Li_Ning213 小时前
为什么 Vite 速度比 Webpack 快?
前端·webpack·node.js
2501_915373883 小时前
Electron 入门指南
前端·javascript·electron
同志327134 小时前
用HTML+CSS做了一个网易云音乐客户端首页
前端·css
小猪欧巴哟4 小时前
pnpm install 安装项目依赖遇到 illegal operation on a directory, symlink 问题
前端·vue.js
独角仙梦境4 小时前
🚀🚀🚀学习这个思路,你也能手撸自己的专属vip脚手架🚀🚀🚀
前端