<template> <!-- 弹出层 --> <van-popup v-model:show='data.isPicker' position='bottom' round @close='confirmOn'> <van-picker ref='picker' title='请选择时间' :columns='data.columns' @cancel='cancelOn' @confirm='onConfirm' v-model='data.selectedValues' :min-date='data.minDate' :max-date='data.maxDate' /> </van-popup> </template> <script setup> import { reactive, watch, getCurrentInstance } from 'vue' import dayjs from 'dayjs' const customFieldName = { text: 'value', value: 'values', children: '' } const data = reactive({ isPicker: false, //是否显示弹出层 columns: [], //所有时间列 selectedValues: [], //控件选择的时间值 showType: [], //控制显示时间格式 年月日时分秒 minDate: null, maxDate: null, }) const props = defineProps({ // 传入的显影状态 showPicker: { type: Boolean }, // 传入的值 values: { type: String }, showType: { type: Array, default: () => { return ['year', 'month', 'day', 'hour', 'minute', 'second'] } }, minDate: { type: Date }, maxDate: { type: Date } }) //定义要向父组件传递的事件 const emit = defineEmits(['changeValue', 'confirm']) watch( () => props.showPicker, val => { data.isPicker = val data.showType = props.showType data.minDate = props.minDate data.maxDate = props.maxDate data.columns = [] getcolumns() }, { immediate: true//立即监听--进入就会执行一次 监听显影状态 } ) watch(()=> data.selectedValues, val => { changeTime() }) function getcolumns() { let strtime = props.values //传入的时间 //console.log(strtime); 2023-09-05 19:28:00 let date = new Date(strtime.replace(/-/g, '/')) // console.log(date); Wed Aug 09 2023 14:53:15 GMT+0800 (中国标准时间) let timeVaules = date.getTime() let dateVaules if (props.values != '') { dateVaules = new Date(timeVaules) } else { dateVaules = new Date() //没有传入时间则默认当前时刻 } let Y = dateVaules.getFullYear() let M = dateVaules.getMonth() let D = dateVaules.getDate() let h = dateVaules.getHours() let m = dateVaules.getMinutes() let s = dateVaules.getSeconds() let minYear = data.minDate ? new Date(data.minDate).getFullYear() : null if (data.showType.includes('year')) { let year = [] //获取前后十年数组 year.values = [] let Currentday = new Date().getFullYear() let minYear = props.minDate ? props.minDate.getFullYear() : Currentday - 10 let maxYear = props.maxDate ? props.maxDate.getFullYear() : Currentday + 10 for (let i = minYear; i < maxYear; i++) { year.push({ text: i.toString(), value: i }) } year.defaultIndex = year.values.indexOf(Y) //设置默认选项当前年 // 个位数补0 const _M = M < 10 ? `0${M + 1}` : `${M + 1}`.toString() //月份比实际获取的少1,所以要加1 const _D = D < 10 ? `0${D}` : D.toString() const _h = h < 10 ? `0${h}` : h.toString() const _m = m < 10 ? `0${m}` : m.toString() const _s = s < 10 ? `0${s}` : s.toString() // 生成年月日时分秒时间值 data.selectedValues.push(Y) data.selectedValues.push(_M) data.selectedValues.push(_D) data.selectedValues.push(_h) data.selectedValues.push(_m) data.selectedValues.push(_s) data.columns.push(year) //生成年列 } if (data.showType.includes('month')) { let month = [] //获取12月数组 let allMon = [] if (data.minDate && minYear == Y) { let minMon = new Date(data.minDate).getMonth() let allM = Object.keys(Array.apply(null, { length: 13 })) allMon = allM.filter(item => item >= minMon) } else { allMon = Object.keys(Array.apply(null, { length: 13 })) } month = allMon.map(function(item) { if (+item + 1 <= 10) { return { text: '0' + item, value: '0' + item } } else if (+item + 1 == 11) { return { text: +item, value: +item } } else { return { text: (+item + 0).toString(), value: (+item + 0).toString() } } }) month.splice(0, 1) data.columns.push(month) //生成月列 } if (data.showType.includes('day')) { //获取当月的天数 let days = getCountDays(Y, M + 1) let day = [] //创建当月天数数组 let allDays = [] if (data.minDate && minYear == Y) { let minDay = new Date(data.minDate).getDate() let allD = Object.keys(Array.apply(null, { length: days + 1 })) allDays = allD.filter(item => item >=(minDay - 1)) } else { allDays = Object.keys(Array.apply(null, { length: days + 1 })) } day = allDays.map(function(item) { if (+item + 1 <= 10) { return { text: '0' + item, value: '0' + item } } else if (+item + 1 == 11) { return { text: +item, value: +item } } else { return { text: (+item + 0).toString(), value: (+item + 0).toString() } } }) day.splice(0, 1) data.columns.push(day) //生成日列 } if (data.showType.includes('hour')) { let hour = [] //创建小时数组 let allHour = [] let minMon = new Date(data.minDate).getMonth() let minDay = new Date(data.minDate).getDate() if (data.minDate && minYear == Y && minMon == M && minDay == D) { let minHour = new Date(data.minDate).getHours() ? new Date(data.minDate).getHours(): new Date().getHours() let allH = Object.keys(Array.apply(null, { length: 24 })) allHour = allH.filter(item => item >= minHour) } else { allHour = Object.keys(Array.apply(null, { length: 24 })) } hour = allHour.map(function(item) { if (+item + 1 <= 10) { return { text: '0' + item, value: '0' + item } } else if (+item + 1 == 11) { return { text: +item, value: +item } } else { return { text: (+item + 0).toString(), value: (+item + 0).toString() } } }) data.columns.push(hour) //生成小时列 } if (data.showType.includes('minute')) { let mi = [] //创建分钟数组 let allMi = [] if (data.minDate && minYear == Y) { let minMi = new Date(data.minDate).getMinutes() ? new Date(data.minDate).getMinutes() : new Date().getMinutes() let allM = Object.keys(Array.apply(null, { length: 60 })) allMi = allM.filter(item => item >= minMi) } else { allMi = Object.keys(Array.apply(null, { length: 60 })) } mi = allMi.map(function(item) { if (+item + 1 <= 10) { return { text: '0' + item, value: '0' + item } } else if (+item + 1 == 11) { return { text: +item, value: +item } } else { return { text: (+item + 0).toString(), value: (+item + 0).toString() } } }) data.columns.push(mi)//生成分钟列 } if (data.showType.includes('second')) { let ss = [] //创建秒数数组 let allSS = [] if (data.minDate && minYear == Y) { let minSS = new Date(data.minDate).getSeconds() ? new Date(data.minDate).getSeconds() : new Date().getSeconds() let allS = Object.keys(Array.apply(null, { length: 60 })) allSS = allS.filter(item => item >= minSS) } else { allSS = Object.keys(Array.apply(null, { length: 60 })) } ss = allSS.map(function(item) { if (+item + 1 <= 10) { return { text: '0' + item, value: '0' + item } } else if (+item + 1 == 11) { return { text: +item, value: +item } } else { return { text: (+item + 0).toString(), value: (+item + 0).toString() } } }) data.columns.push(ss)//生成秒钟列 } } function getCountDays(year, month) { //获取某年某月多少天 let day = new Date(year, month, 0) return day.getDate() } // 关闭弹框 function confirmOn() { emit('changeValue') } function changeTime() { if (data.selectedValues && data.selectedValues.length) { //存在最小时间时触发 if (props.minDate) { let endval = data.selectedValues[0] + '-' + data.selectedValues[1] + '-' + data.selectedValues[2] + ' ' + data.selectedValues[3] + ':' + data.selectedValues[4] + ':' + data.selectedValues[5] let selectAll = dayjs(endval).format('YYYY-MM-DD HH:mm:ss') changeColumns(selectAll) } } } function changeColumns(val) { data.columns = [] let strtime = val //传入的时间 let date = new Date(strtime.replace(/-/g, '/')) let timeVaules = date.getTime() let dateVaules = new Date(timeVaules) let Y = dateVaules.getFullYear() let M = dateVaules.getMonth() let D = dateVaules.getDate() let h = dateVaules.getHours() let m = dateVaules.getMinutes() let s = dateVaules.getSeconds() let minYear = data.minDate ? new Date(data.minDate).getFullYear() : null if (data.showType.includes('year')) { let year = [] //获取前后十年数组 year.values = [] let Currentday = new Date().getFullYear() let minYear = props.minDate ? props.minDate.getFullYear() : Currentday - 10 let maxYear = props.maxDate ? props.maxDate.getFullYear() : Currentday + 10 for (let i = minYear; i < maxYear; i++) { year.push({ text: i.toString(), value: i }) } year.defaultIndex = year.values.indexOf(Y) //设置默认选项当前年 // 个位数补0 const _M = M < 10 ? `0${M + 1}` : `${M + 1}`.toString() //月份比实际获取的少1,所以要加1 const _D = D < 10 ? `0${D}` : D.toString() const _h = h < 10 ? `0${h}` : h.toString() const _m = m < 10 ? `0${m}` : m.toString() const _s = s < 10 ? `0${s}` : s.toString() // 生成年月日时分秒时间值 data.selectedValues.push(Y) data.selectedValues.push(_M) data.selectedValues.push(_D) data.selectedValues.push(_h) data.selectedValues.push(_m) data.selectedValues.push(_s) data.columns.push(year) //生成年列 } if (data.showType.includes('month')) { let month = [] //获取12月数组 let allMon = [] if (data.minDate && minYear == Y) { let minMon = new Date(data.minDate).getMonth() let allM = Object.keys(Array.apply(null, { length: 13 })) allMon = allM.filter(item => item >= minMon) } else { allMon = Object.keys(Array.apply(null, { length: 13 })) } month = allMon.map(function(item) { if (+item + 1 <= 10) { return { text: '0' + item, value: '0' + item } } else if (+item + 1 == 11) { return { text: +item, value: +item } } else { return { text: (+item + 0).toString(), value: (+item + 0).toString() } } }) month.splice(0, 1) data.columns.push(month) //生成月列 } if (data.showType.includes('day')) { //获取当月的天数 let days = getCountDays(Y, M + 1) let day = [] //创建当月天数数组 let allDays = [] if (data.minDate && minYear == Y) { let minDay = new Date(data.minDate).getDate() let allD = Object.keys(Array.apply(null, { length: days + 1})) allDays = allD.filter(item => item >= (minDay - 1)) } else { allDays = Object.keys(Array.apply(null, { length: days + 1})) } day = allDays.map(function(item) { if (+item + 1 <= 10) { return { text: '0' + item, value: '0' + item } } else if (+item + 1 == 11) { return { text: +item, value: +item } } else { return { text: (+item + 0).toString(), value: (+item + 0).toString() } } }) day.splice(0, 1) data.columns.push(day) //生成日列 } if (data.showType.includes('hour')) { let hour = [] //创建小时数组 let allHour = [] let minMon = new Date(data.minDate).getMonth() let minDay = new Date(data.minDate).getDate() if (data.minDate && minYear == Y && minMon == M && minDay == D) { let minHour = new Date(data.minDate).getHours() ? new Date(data.minDate).getHours(): new Date().getHours() let allH = Object.keys(Array.apply(null, { length: 24 })) allHour = allH.filter(item => item >= minHour) } else { allHour = Object.keys(Array.apply(null, { length: 24 })) } hour = allHour.map(function(item) { if (+item + 1 <= 10) { return { text: '0' + item, value: '0' + item } } else if (+item + 1 == 11) { return { text: +item, value: +item } } else { return { text: (+item + 0).toString(), value: (+item + 0).toString() } } }) data.columns.push(hour) //生成小时列 } if (data.showType.includes('minute')) { let mi = [] //创建分钟数组 let allMi = [] if (data.minDate && minYear == Y) { let minMi = new Date(data.minDate).getMinutes() ? new Date(data.minDate).getMinutes() : new Date().getMinutes() let allM = Object.keys(Array.apply(null, { length: 60 })) allMi = allM.filter(item => item >= minMi) } else { allMi = Object.keys(Array.apply(null, { length: 60 })) } mi = allMi.map(function(item) { if (+item + 1 <= 10) { return { text: '0' + item, value: '0' + item } } else if (+item + 1 == 11) { return { text: +item, value: +item } } else { return { text: (+item + 0).toString(), value: (+item + 0).toString() } } }) data.columns.push(mi)//生成分钟列 } if (data.showType.includes('second')) { let ss = [] //创建秒数数组 let allSS = [] if (data.minDate && minYear == Y) { let minSS = new Date(data.minDate).getSeconds() ? new Date(data.minDate).getSeconds() : new Date().getSeconds() let allS = Object.keys(Array.apply(null, { length: 60 })) allSS = allS.filter(item => item >= minSS) } else { allSS = Object.keys(Array.apply(null, { length: 60 })) } ss = allSS.map(function(item) { if (+item + 1 <= 10) { return { text: '0' + item, value: '0' + item } } else if (+item + 1 == 11) { return { text: +item, value: +item } } else { return { text: (+item + 0).toString(), value: (+item + 0).toString() } } }) data.columns.push(ss)//生成秒钟列 } } //时间选择器关闭 值不改变并关闭弹框 function cancelOn({ selectedValues }) { confirmOn() } // 时间选择器确定 值改变 function onConfirm({ selectedValues }) { let endval = selectedValues[0] + '-' + selectedValues[1] + '-' + selectedValues[2] + ' ' + selectedValues[3] + ':' + selectedValues[4] + ':' + selectedValues[5] confirmOn() emit('confirm', endval) } </script>