123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 |
- // components/date-time-picker/index.js
- Component({
- /**
- * 定义组件生命周期函数
- */
- lifetimes: {
- attached() {
- // =====初始化时间选择器====
- this._initDateTimePickerFn()
- },
- detached() {
- }
- },
- /**
- * 对 <2.2.3 版本基础库的兼容
- */
- attached() {
- // =====初始化时间选择器====
- this._initDateTimePickerFn()
- },
- detached() {
-
- },
- /**
- * 组件相关配置项
- */
- options: {
- multipleSlots: true // 开启使用多个插槽
- },
- /**
- * 组件的属性列表
- */
- properties: {
- mode: { // 选择器类型
- type: String,
- require: true
- },
- value: { // 回显的时间
- type: String,
- value: ''
- }
- },
- /**
- * 组件的初始数据
- */
- data: {
- rangeList: [],
- rangeValue: [],
- dateDetails: ['年','月', '时', '分', '秒']
- },
- /**
- * 组件的方法列表
- */
- methods: {
- /**
- * 初始化时间选择器
- */
- _initDateTimePickerFn() {
- try {
- const { value, mode} = this.data
- if (mode != 'dateminute' && mode != 'datetime') {
- throw new CommonException('请输入合法的时间选择器类型!', -1)
- }
- //====获取到当前时间===
- let showTimeValue = this._validateShowTime(value, mode)
- // ====获取年份====
- const currentYear = showTimeValue.substring(0, showTimeValue.indexOf('-'))
- const currentMouth = showTimeValue.split(" ")[0].split('-')[1]
- const yearList = this._gotDateTimeList({
- _start: Number(currentYear) - 100,
- _end: Number(currentYear) + 100, _type: 0
- })
- // ====获取月份===
- const monthList = this._gotDateTimeList({ _start: 1, _end: 12, _type: 1 })
- //====获取天数===
- const dayList = this._gotDayList(currentYear, currentMouth)
- // ====获取小时===
- const hourList = this._gotDateTimeList({ _start: 0, _end: 23, _type: 2 })
- // ====获取分钟===
- const munithList = this._gotDateTimeList({ _start: 0, _end: 59, _type: 3 })
- // ====获取秒===
- const secondList = this._gotDateTimeList({ _start: 0, _end: 59, _type: 4 })
- let rangeList = new Array()
- rangeList.push(yearList)
- rangeList.push(monthList)
- rangeList.push(dayList)
- rangeList.push(hourList)
- rangeList.push(munithList)
- mode === "datetime" && rangeList.push(secondList)
- this.setData({
- rangeList
- }, () => {
- this._echoDateTime(showTimeValue) // 初始化时间显示
- })
- } catch(err) {
- console.log(err)
- }
- },
- /**
- * 验证显示的时间是否合法
- * @param {Number} _value 要验证的时间
- * @param {Number} _mode 选择器类型
- */
- _validateShowTime(_value, _mode){
- let currentTime = formatTime(new Date()).replace(/\//g, "-")
- let showTimeValue = _value.trim() || currentTime
- const secondReg = /^\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}$/
- const munithReg = /^\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}$/
- if (_mode === 'dateminute') { // yyyy-MM-dd HH:mm
- // 验证是否合法
- secondReg.test(showTimeValue) && (showTimeValue = showTimeValue.substring(0, showTimeValue.lastIndexOf(':')))
- munithReg.test(showTimeValue) || (showTimeValue = currentTime.substring(0, currentTime.lastIndexOf(':')))
- } else { // yyyy-MM-dd HH:mm:ss
- munithReg.test(showTimeValue) && (showTimeValue += ':00')
- secondReg.test(showTimeValue) || (showTimeValue = currentTime)
- }
- return showTimeValue
- },
-
- /**
- * 获取年份、月份、小时、分钟、秒
- * @param {Number} _start 开始值
- * @param {Number} _end 结束值
- * @param {Number} _type 类型
- */
- _gotDateTimeList({_start, _end, _type}) {
- let resultDataList = new Array()
- for (let i = _start; i <= _end; i ++) {
- resultDataList.push(this._addZore(i) )
- }
- return resultDataList
- },
- /**
- * 获取天数
- * @param {Number} _year 年份
- * @param {Number} _mouth 月份
- */
- _gotDayList(_year, _mouth) {
- let now = new Date(_year, _mouth, 0)
- const dayLength = now.getDate()
- let dayList = new Array()
- for(let i = 1; i <= dayLength; i++) {
- dayList.push(this._addZore(i))
- }
- return dayList
- },
- /**
- * 补零
- * @param {Number} _num 数值
- */
- _addZore(_num) {
- return _num < 10 ? '0' + _num : _num.toString()
- },
- /**
- * 回显时间
- * @param {Number} _showTimeValue 初始化时要显示的时间
- */
- _echoDateTime(_showTimeValue) {
- const rangeList = this.data.rangeList
- let rangeValue = new Array()
- const list = _showTimeValue.split(/[\-|\:|\s]/)
- list.map((el, index) => {
- rangeList[index].map((item, itemIndex) => {
- item.indexOf(el) !== -1 && rangeValue.push(itemIndex)
- })
- })
- this.setData({
- rangeValue
- })
- },
- /**
- * 点击确定时触发的回调函数
- * @param {Number} ev
- */
- selectChangeFn(ev) {
- const selectValues = ev.detail.value
- const rangeList = this.data.rangeList
- let dateTime = ''
- selectValues.map((el, index) => {
- dateTime += rangeList[index][el].substring(0, rangeList[index][el].length)
- if(index == 0 || index == 1) {
- dateTime += '-'
- } else if (index == 3 || (index == 4 && index != selectValues.length - 1)) {
- dateTime += ':'
- } else if(index == 2 && index != selectValues.length -1){
- dateTime += ' '
- }
- })
- // ====触发父组件把值传递给父组件====
- this.triggerEvent('change', {value: dateTime})
- },
- /**
- * 当具体的一项的值发生改变时触发
- * @param {Number} ev
- */
- selectColumnChangeFn(ev) {
- const { column, value } = ev.detail
- let { rangeList, rangeValue } = this.data
- let selectValue = Number(rangeList[column][value]
- .substring(0, rangeList[column][value].length - 1))
- if (column === 1) { // 改变月份
- const currentYear = Number(rangeList[0][rangeValue[0]]
- .substring(0, rangeList[0][rangeValue[0]].length - 1))
- const dayList = this._gotDayList(currentYear, selectValue)
- rangeList[column + 1] = dayList
- }
- this.setData({
- rangeList
- })
- }
- }
- })
- // 自定义异常
- function CommonException(errMsg, code){
- this.errMsg = errMsg
- this.code = code
- }
- // =====格式化日期===
- const formatTime = date => {
- const year = date.getFullYear()
- const month = date.getMonth() + 1
- const day = date.getDate()
- const hour = date.getHours()
- const minute = date.getMinutes()
- const second = date.getSeconds()
- return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
- }
- const formatNumber = n => {
- n = n.toString()
- return n[1] ? n : '0' + n
- }
|