UNPKG

jimu-mobile

Version:

积木组件库助力移动端开发

401 lines (348 loc) 12.5 kB
import React, { Component} from 'react' import ReactDOM from 'react-dom' import PropTypes from 'prop-types' import Picker from '../picker/picker.js' class DateTimePicker extends Component { constructor () { super() } static propTypes = { open: PropTypes.bool, pickerAway: PropTypes.func, len: PropTypes.number } static defaultProps = { textvalue: '时间组件按钮', pickerAway() {}, open: false, format: ['yyyy年MM月dd日', '点', '分'], startData: '2017/12/21 23:55', endData: '2018/1/8 01:20', defaultData: '2017/12/31 23:55', scale: 5, // 分钟刻度 titleName: '当前时间', // title nameFormatBool: true // 日期显示格式 } componentWillMount () { this.setInitState() } componentWillReceiveProps (nextProps) { this.setInitState() } setInitState () { let {startData, endData, defaultData, scale, format, open, nameFormatBool} = this.props, // delay 以后获取时间 dates = this.setDateFormat(defaultData, 'yyyy/MM/dd hh:mm'), // 设置默认显示参数 onDataTime = this._getTimeRound(defaultData, scale), startDateTime = this._getTimeRound(startData, scale), endDateTime = this._getTimeRound(endData, scale), len = this._getDayDiff(endDateTime.split(' ')[0], startDateTime.split(' ')[0]), onDataArr = this.setDateFormat(onDataTime, 'yyyy/MM/dd hh:mm'), startDateArr = this.setDateFormat(startDateTime, 'yyyy/MM/dd hh:mm'), endDateArr = this.setDateFormat(endDateTime, 'yyyy/MM/dd hh:mm'), // 获取时间范围 getHoverOver = this._checkHourOver(onDataArr, startDateArr, endDateArr), startMinutes = 0, endMinutes = 59, nowdate = this._getDataTime(), tomorrow = this._tomorrowData(), valueFirst = this.setDateFormat(onDataTime, 'yyyy/M/d').fmt, setValueFirst = `${this.setDateFormat(onDataTime,format[0]).fmt}` if (nameFormatBool) { if (valueFirst == nowdate) { setValueFirst = '今天' }else if (valueFirst == tomorrow) { setValueFirst = '明天' } } // 设置起始的分钟数 if (onDataTime.split(':')[0] == startDateTime.split(':')[0]) { startMinutes = startDateArr.datelist.m } if (onDataTime.split(':')[0] == endDateTime.split(':')[0]) { endMinutes = endDateArr.datelist.m } this.setState({ open, onDataTime, startDateTime, endDateTime, len, onDataArr, startDateArr, endDateArr, value: [setValueFirst, `${onDataArr.datelist.h}${format[1]}`, `${onDataArr.datelist.m}${format[2]}`], // 默认数值 开始时间 、 结束时间 options: [this._setInitData(startDateArr.fmt, len), this._setInitHour(getHoverOver.starthour, getHoverOver.endhour), this._setInitMinutes(startMinutes, endMinutes)] // 初始数值 }) } // 判断小时展示范围 _checkHourOver (onDataArr, startDate, endDate) { let starthour = 0, endhour = 23 // 判断当前日期是否是起始日期 if (onDataArr.datelist.y == startDate.datelist.y && onDataArr.datelist.M == startDate.datelist.M && onDataArr.datelist.d == startDate.datelist.d) { starthour = startDate.datelist.h } // 判断当前日期是否是结束日期 if (onDataArr.datelist.y == endDate.datelist.y && onDataArr.datelist.M == endDate.datelist.M && onDataArr.datelist.d == endDate.datelist.d) { endhour = endDate.datelist.h } return { starthour, endhour} } // 获取两个区间日期 direction :before 获取开始日期,after 获取结束日期 _getDataDiff (onData, sectionMinutes, direction) { let {scale} = this.props, timestamp = new Date(onData).getTime(), diffTamp = sectionMinutes * 1000 * 60, diffDate = direction == 'after' ? timestamp + diffTamp : timestamp - diffTamp, date = new Date(parseInt(diffDate)), setMinutes = date.getMinutes() for (var i = setMinutes,max = setMinutes + scale; i <= max; i++) { if (!(i % scale)) { setMinutes = i >= 60 ? (i - 60) : i } } return `${date.getFullYear()}/${date.getMonth() + 1}/${date.getDate()} ${date.getHours()}:${setMinutes}` } // 当前日期取整 upward 是否向上取值 _getTimeRound (time, scale, upward = true) { let onMinutes = Number(time.split(':')[1]), timestamp = new Date(time).getTime(), scaleMinutes = onMinutes, diffTamp = 0, isback = true if (upward) { for (var i = onMinutes,max = onMinutes + scale; i <= max; i++) { if (!(i % scale) && isback) { scaleMinutes = i isback = false } } }else { for (var i = onMinutes,min = onMinutes - scale; i >= min; i--) { if (!(i % scale) && isback) { scaleMinutes = i isback = false } } } diffTamp = (scaleMinutes - onMinutes) * 1000 * 60 let date = new Date(parseInt(timestamp + diffTamp)) return `${date.getFullYear()}/${date.getMonth() + 1}/${date.getDate()} ${date.getHours()}:${date.getMinutes()}` } // 查看两个日期间隔几天 startDate、endDate 格式 如:2017/8/2 _getDayDiff (startDate, endDate) { let startTime = new Date(Date.parse(startDate)).getTime(), endTime = new Date(Date.parse(endDate)).getTime(), dates = Math.abs((startTime - endTime)) / (1000 * 60 * 60 * 24) return dates } // 设置初始日期展示 _setInitData (startDate, len) { let self = this,{format, delay, nameFormatBool} = this.props, timestamp = new Date(startDate).getTime(), dataArr = [], nowdate = this._getDataTime(), tomorrow = this._tomorrowData() this.dataTimeArr = [] for (let i = 0; i <= len; i++) { let tamp = timestamp + 24 * 60 * 60 * 1000 * i if (nameFormatBool) { if (nowdate == self.setDateFormat(new Date(parseInt(tamp)), 'yyyy/M/d').fmt) { dataArr.push('今天') }else if (tomorrow == self.setDateFormat(new Date(parseInt(tamp)), 'yyyy/M/d').fmt) { dataArr.push('明天') }else { dataArr.push(self.setDateFormat(new Date(parseInt(tamp)), format[0]).fmt) } }else { dataArr.push(self.setDateFormat(new Date(parseInt(tamp)), format[0]).fmt) } this.dataTimeArr.push(self.setDateFormat(new Date(parseInt(tamp)), 'yyyy/MM/dd').fmt) } return dataArr } // 设置初始小时展示 _setInitHour (starthour, endhour) { let self = this,{value, format, scale} = this.props, hourArr = [], deleytamp = new Date().getTime() + 60 * 1000 * scale, date = new Date(parseInt(deleytamp)), dates = this.setDateFormat(date, 'yyyy/MM/dd hh:mm'), gethour = starthour for (let i = gethour; i <= endhour; i++) { hourArr.push(i + format[1]) } return hourArr } // 设置初始小时展示 _setInitMinutes (minutes, end) { let self = this,{scale, value, format} = this.props, minutesArr = [] for (let i = 0; i <= end; i++) { // minutesArr.push(i + format[1]) if (!(i % scale)) { if (minutes <= i) { minutesArr.push(i + format[2]) } } } minutesArr = minutesArr.length == 0 ? [`0${format[2]}`] : minutesArr return minutesArr } // 设置delay 以后时间 日期格式化 yyyy-MM-dd hh:mm ; yyyy/MM/dd hh:mm setDateFormat (nowdate, fmt) { let deleytamp = new Date(nowdate).getTime(), date = new Date(parseInt(deleytamp)), o = { 'M+': date.getMonth() + 1, // 月份 'd+': date.getDate(), // 日 'h+': date.getHours(), // 小时 'm+': date.getMinutes(), // 分 's+': date.getSeconds() // 秒 } if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)) for (var k in o) { if (new RegExp('(' + k + ')').test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length))) } return { fmt, datelist: { y: date.getFullYear(), M: date.getMonth() + 1, d: date.getDate(), h: date.getHours(), m: date.getMinutes() } } } // 获取当前日期 _tomorrowData () { let deleytamp = new Date().getTime() + 24 * 60 * 60 * 1000, d = new Date(parseInt(deleytamp)) return d.getFullYear() + '/' + (d.getMonth() + 1) + '/' + d.getDate() } // 获取当前日期 _getDataTime () { let d = new Date() return d.getFullYear() + '/' + (d.getMonth() + 1) + '/' + d.getDate() } onClickAway () { let {format} = this.props,{value, onDataTime} = this.state, fmt = new Date(onDataTime).getTime() this.props.pickerAway && this.props.pickerAway(value, onDataTime, this.refs.pickertime, { fmt, data: onDataTime }) } // 字符串删除单位 _deleteStrUnit (string, unit) { return string.split(unit)[0] } onChange (val, text , listIndex) { let {format} = this.props,{options, value, len, startDateArr, endDateArr, startDateTime, endDateTime, onDataTime} = this.state, day = options[0], hours = options[1], minutes = options[2], setHour = hours, setMinute = minutes, onDay = value[0], onHours = value[1], onMinutes = value[2] // 日期更改时 if (listIndex === 0) { onDay = val // 开始日期 if (onDay == day[0]) { let getHour = this._deleteStrUnit(onHours, format[1]) // 判断小时是否在开始范围内 setHour = this._setInitHour(startDateArr.datelist.h, 23) if (getHour < startDateArr.datelist.h) { onHours = startDateArr.datelist.h + format[1] } } // 结束日期 if (onDay == day[len]) { let getHour = this._deleteStrUnit(onHours, format[1]) setHour = this._setInitHour(0, endDateArr.datelist.h) if (getHour > endDateArr.datelist.h) { onHours = endDateArr.datelist.h + format[1] } } if (onDay !== day[0] && onDay !== day[len]) { setHour = this._setInitHour(0, 23) } } // 小时修改时 if (listIndex === 1) { onHours = val } if (listIndex === 2) { onMinutes = val } // 开始日期 if (onDay == day[0] && onHours == setHour[0]) { let getMinute = this._deleteStrUnit(onMinutes, format[2]), endMinutes = startDateTime.split(':')[0] == endDateTime.split(':')[0] ? endDateArr.datelist.m : 59 // 判断分钟是否在开始范围内 setMinute = this._setInitMinutes(startDateArr.datelist.m, endMinutes) if (getMinute < Number(startDateArr.datelist.m)) { onMinutes = startDateArr.datelist.m + format[2] } } // 结束日期 else if (onDay == day[len] && this._deleteStrUnit(onHours, format[1]) == endDateArr.datelist.h) { let getMinute = this._deleteStrUnit(onMinutes, format[2]) // 判断分钟是否在开始范围内 setMinute = this._setInitMinutes(0, endDateArr.datelist.m) if (getMinute > Number(endDateArr.datelist.m)) { onMinutes = endDateArr.datelist.m + format[2] } }else { setMinute = this._setInitMinutes(0, 59) } // 设置日期 for (var i = day.length - 1; i >= 0; i--) { if (day[i] == onDay) { onDataTime = `${this.dataTimeArr[i]} ${this._deleteStrUnit(onHours,format[1])}:${this._deleteStrUnit(onMinutes,format[2])}` } } this.setState({ onDataTime, value: [onDay, onHours, onMinutes], options: [day, setHour, setMinute] }) } render () { const {textvalue} = this.props return ( <div className='dataPicker'> <div className='pickertime' onClick={this._onClick.bind(this)} ref='pickertime'> {textvalue} </div> <Picker ref='date_picker' value={this.state.value} options={this.state.options} onChange={this.onChange.bind(this)} onClickAway={this.onClickAway.bind(this)} open={this.state.open} titleName={this.props.titleName} /> </div> ) } _onClick () { this._showFunc() } show () { this._showFunc() } _showFunc () { this.setInitState() this.refs.date_picker.show() } } module.exports = DateTimePicker