el-date-picker ,自定义输入数字自动转换显示yyyy-mm-dd HH:mm:ss格式 【仅双日历 datetimerange专用】

javascript 复制代码
// 【仅双日历 datetimerange】 专用
export function handleDateTimeInput(
  e: KeyboardEvent,
  formData: Record<string, any>,
  field: string
) {
  // 1. 只允许数字 + 控制键
  const isNumber = /^[0-9]$/.test(e.key)
  const isControl = ['Backspace', 'Delete', 'ArrowLeft', 'ArrowRight', 'Tab'].includes(e.key)

  if (!isNumber && !isControl) {
    e.preventDefault()
    return
  }
  if (isControl) return

  setTimeout(() => {
    const input = e.target as HTMLInputElement
    if (!input) return

    let val = input.value.replace(/\D/g, '')
    if (val.length < 8) return

    const date = val.slice(0, 8)
    const time = val.slice(8, 14)
    const y = date.slice(0, 4)
    const m = date.slice(4, 6)
    const d = date.slice(6, 8)
    let dateStr = `${y}-${m}-${d}`

    let timeStr = ''
    if (time.length >= 1) timeStr = time.slice(0, 1)
    if (time.length >= 2) timeStr = time.slice(0, 2)
    if (time.length >= 3) timeStr = time.slice(0, 2) + ':' + time.slice(2, 3)
    if (time.length >= 4) timeStr = time.slice(0, 2) + ':' + time.slice(2, 4)
    if (time.length >= 5) timeStr = time.slice(0, 2) + ':' + time.slice(2, 4) + ':' + time.slice(4, 5)
    if (time.length >= 6) timeStr = time.slice(0, 2) + ':' + time.slice(2, 4) + ':' + time.slice(4, 6)

    let final = dateStr
    if (timeStr) final += ' ' + timeStr

    input.value = final
    input.dispatchEvent(new Event('input'))

    if (val.length === 14) {

      const formattedDate = dayjs(final).format('YYYY-MM-DD HH:mm:ss')
      const isStart = input.placeholder.includes('开始')

      if (isStart) {
        formData[field][0] = formattedDate
      } else {
        formData[field][1] = formattedDate
      }

      input.dispatchEvent(new Event('change'))
    }
  }, 0)
}

使用方法:使用@keydown来进行触发

javascript 复制代码
<el-date-picker
v-model="form.effectiveTime"
type="datetimerange"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
range-separator="至"
start-placeholder="开始时间"
end-placeholder="结束时间"
style="width: 360px"
@keydown="handleDateTimeInput($event, form, 'effectiveTime')"
/>
相关推荐
无人生还1 分钟前
从 Vue3 到 React · 快速上手系列第 9 篇:自定义 Hook(对标 Composables)
前端·vue.js·react.js
小灰灰搞电子7 分钟前
Qt 队列容器 QQueue 的详解与示例
开发语言·qt·qqueue
张龙68713 分钟前
RAG 知识库问答系统实战:分块、混合检索、RRF 融合与重排全链路拆解
前端
用户13060956072313 分钟前
第二章学完后,我对 webpack5 前端工程化的一点理解
前端
a11177614 分钟前
小鸡下蛋 小游戏 html
前端·开源·html
码哥DFS22 分钟前
算法练习day1-备战2027届秋招
前端·javascript·数据结构·算法
张元清24 分钟前
React useInfiniteScroll Hook:无限滚动轻松实现(2026)
javascript·react.js
Bigger25 分钟前
因为一句「华流才是最屌的」,我做了一个中国风设计的 Skill
前端·人工智能·设计
ACP广源盛1392462567333 分钟前
GSV6155@ACP# Type-C 视频信号转换芯片:技术架构、工程痛点适配与落地场景分析
大数据·c语言·开发语言·人工智能·分布式·嵌入式硬件·架构
别怪我很水33 分钟前
Vue element admin 浏览器本地存储 localStorage、useStorage
前端·javascript·vue.js