当前位置: 首页 > article >正文

vue3+ts+vite+element plus设置日期时间禁止选择小于当前时间精确到时分秒

ts组件

// timeUtils.ts

/**
 * 生成一个数组
 * @param start
 * @param end
 */
export const makeRange = (start: number, end: number): number[] => {
  const result: number[] = [];
  for (let i = start; i <= end; i++) {
    result.push(i);
  }
  return result;
};

/**
 * 限制今天之前的时间不能选择(小时)
 * @param beginTime 开始时间
 */
export const disabledHours = (beginTime: string): number[] | undefined => {
  let newVal = new Date(beginTime);
  if (
    newVal &&
    newVal.getFullYear() === new Date().getFullYear() &&
    newVal.getMonth() === new Date().getMonth() &&
    newVal.getDate() === new Date().getDate()
  ) {
    // 如果为今天,则限制当前时间前的时间不能选择。
    return makeRange(0, new Date().getHours() - 1);
  }
  return undefined;
};

/**
 * 限制今天之前的时间不能选择(分钟)
 * @param beginTime 开始时间
 * @param hour 小时
 */
export const disabledMinutes = (beginTime: string, hour: number): number[] => {
  let newVal = new Date(beginTime);
  if (
    newVal &&
    newVal.getFullYear() === new Date().getFullYear() &&
    newVal.getMonth() === new Date().getMonth() &&
    newVal.getDate() === new Date().getDate() &&
    newVal.getHours() === hour // 确保小时也相同
  ) {
    // 如果为今天且小时相同,则限制当前时间前的分钟不能选择。
    return makeRange(0, new Date().getMinutes() - 1);
  }
  return []; // 其他情况不限制
};

/**
 * 禁用小于当前时间的秒
 * @param beginTime 开始时间
 * @param hour 小时
 * @param minute 分钟
 */
export const disabledSeconds = (beginTime: string, hour: number, minute: number): number[] => {
  let newVal = new Date(beginTime);
  if (
    newVal &&
    newVal.getFullYear() === new Date().getFullYear() &&
    newVal.getMonth() === new Date().getMonth() &&
    newVal.getDate() === new Date().getDate() &&
    newVal.getHours() === hour &&
    newVal.getMinutes() === minute
  ) {
    // 如果为今天且小时、分钟相同,则限制当前时间前的秒不能选择。
    return makeRange(0, new Date().getSeconds() - 1);
  }
  return []; // 其他情况不限制
};

// 新增格式化函数,将日期对象转换为 YYYY-MM-DD HH:mm 格式
export const formatDate = (date: Date): string => {
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const day = String(date.getDate()).padStart(2, '0');
  const hours = String(date.getHours()).padStart(2, '0');
  const minutes = String(date.getMinutes()).padStart(2, '0');
  const seconds = String(date.getSeconds()).padStart(2, '0') // 添加秒的处理
  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}` // 返回包含秒的字符串
};

父组件调用 

    <el-date-picker
                      v-model="ruleForm.beginTime"
                      type="datetime"
                      value-format="YYYY-MM-DD HH:mm:ss"
                      v-bind="pickerOptions"
                      placeholder="选择日期时间"
   @focus="handleDatePickerFocus"
                    >

js

  import {
    makeRange,
    disabledHours,
    disabledMinutes,
    disabledSeconds,
    formatDate,
  } from './timeUtils'

  // 编辑表单数据
  const ruleForm = reactive<EditDataType['RuleForm']>({

    beginTime: '',
  })
  // 表单数据检验
  const rules = reactive<FormRules<EditDataType['RuleForm']>>({
  
    beginTime: [
      {
        type: 'date',
        required: true,
        message: '请选择时间',
        trigger: 'change',
      },
    ],
   
  })

 /**
   * 限制今天之前的时间不能选择的配置
   */
  const pickerOptions = computed(() => {
    return {
      // 限制今天之前的日期不能选择
      disabledDate(time: any) {
        return time.getTime() < Date.now() - 8.64e7
      },
      // 限制今天之前的小时不能选择
      disabledHours: () => disabledHours(ruleForm.beginTime),
      // 限制今天之前的分钟不能选择
      disabledMinutes: (hour: number) =>
        disabledMinutes(ruleForm.beginTime, hour),
      // 限制今天之前的秒不能选择
      disabledSeconds: (hour: number, minute: number) =>
        disabledSeconds(ruleForm.beginTime, hour, minute),
    }
  })
  // 处理 el-date-picker 的 focus 事件
  const handleDatePickerFocus = () => {
    // 在这里进行赋值操作,例如将当前时间赋值给 beginTime
    ruleForm.beginTime = formatDate(new Date())
  }


http://www.kler.cn/a/541761.html

相关文章:

  • HTML之JavaScript对象声明
  • C语言-结构体
  • 微信小程序案例2——天气微信小程序(学会绑定数据)
  • mysql8.0使用MHA实现高可用
  • Linux之kernel(4)netlink通信
  • aio-pika 快速上手(Python 异步 RabbitMQ 客户端)
  • 网络安全网格架构(CSMA) 网络安全框架csf
  • HTML全局属性与Meta元信息详解:优化网页的灵魂
  • DeepSeek-R1的蒸馏
  • 网络安全检查漏洞内容回复 网络安全的漏洞
  • Halcon.Net与Numpy、OpenCV联合编程
  • hi3516cv610用海思arm-v01c02-linux-musleabi-strip工具,对库进行瘦身
  • 从0开始C语言(8)
  • 本地部署DeepSeek-R1(Ollama+Docker+Dify知识库)
  • 强化学习概念入门
  • 车联网安全入门一:了解CAN总线及环境模拟
  • 如何避免SQL注入
  • checklist是个好东西
  • 计算机毕业设计——Springboot点餐平台网站
  • 2025 年 2 月 TIOBE 指数
  • 反向海淘新趋势:独立站跨境代购系统的技术架构与运营策略
  • 【嵌入式Linux应用开发基础】文件I/O基础编程
  • 【StableDiffusion容器化部署】分步指南
  • 1064 - You have an error in your SQL syntax;
  • PDF Shaper:免费多功能 PDF 工具箱,一站式满足您的 PDF 需求!
  • 【动态规划】风扫枯杨,满地堆黄叶 - 9. 完全背包问题