image.png
1 在components 下創(chuàng)建文件夾 datePicker
2 datePicker.json 下 { "component": true} 定義為組件
3 在until 下 創(chuàng)建dataPicker.js
class BaseInfo {
constructor() {
this.newDate = new Date();
}
withData(param) {
return parseInt(param) < 10 ? '0' + param : '' + param;
}
getLoopArray(start, end) {
var start = start || 0;
var end = end || 0;
var array = [];
for (var i = start; i <= end; i++) {
array.push(this.withData(i));
}
return array;
}
formatArr(dateString) {
return [...dateString.split(' ')[0].split('-'), ...dateString.split(' ')[1].split(':')]
//return [...dateString.split(' ')[0].split('-')]
}
beforeDateArr(disYear) {
/*
* 處理前
* 獲取當(dāng)前時(shí)間
*/
let year = this.newDate.getFullYear() - (disYear || 0)
let month = this.newDate.getMonth() + 1
let day = this.newDate.getDate()
let hour = this.newDate.getHours()
let minute = this.newDate.getMinutes()
return [year, month, day, hour, minute]
}
afterDateArr() {
/*
* 處理后
* 獲取當(dāng)前時(shí)間
*/
let year = this.withData(this.newDate.getFullYear())
let mont = this.withData(this.newDate.getMonth() + 1)
let date = this.withData(this.newDate.getDate())
let hour = this.withData(this.newDate.getHours())
let minu = this.withData(this.newDate.getMinutes())
return [year, mont, date, hour, minu];
}
}
// 實(shí)現(xiàn)
class dateTimePicker extends BaseInfo {
constructor(startDate, endDate, defaultDate) {
super();
this.dateTimeArray = null
this.dateTime = null
this.startDate = super.formatArr(startDate); // 開始時(shí)間
this.endDate = endDate ? super.formatArr(endDate) : super.afterDateArr(); // 結(jié)束時(shí)間
this.defaultDate = defaultDate ? super.formatArr(defaultDate) : this.startDate;
}
setValue(obj) {
for (let key in obj) {
this[key] = obj[key]
}
}
/* 獲取當(dāng)前切換選擇的日期值*/
getCurDateInfo() {
return this.dateTime && this.dateTimeArray ? {
year: this.dateTimeArray[0][this.dateTime[0]],
month: this.dateTimeArray[1][this.dateTime[1]],
day: this.dateTimeArray[2][this.dateTime[2]],
hour: this.dateTimeArray[3][this.dateTime[3]],
second: this.dateTimeArray[4][this.dateTime[4]],
} : {}
}
/* 獲取月數(shù)組*/
getMonths() {
let array = []
const year = (this.getCurDateInfo().year || this.defaultDate[0]).replace(/年/, '');
if (this.startDate[0] == this.endDate[0]) {
/*
* 開始的年和結(jié)束的年相同
* 就取(開始月腾仅,結(jié)束月)
*/
array = super.getLoopArray(parseInt(this.startDate[1]), parseInt(this.endDate[1]))
} else {
switch (year) {
case this.startDate[0]:
/* 開始年 */
array = super.getLoopArray(parseInt(this.startDate[1]), 12)
break;
case this.endDate[0]:
/* 結(jié)束年 */
array = super.getLoopArray(1, parseInt(this.endDate[1]))
break;
default:
array = super.getLoopArray(1, 12)
break;
}
}
return array;
}
/* 獲取日數(shù)組*/
getDays() {
let array = []
let lastDay = null
const year = (this.getCurDateInfo().year || this.defaultDate[0]).replace(/年/, '');
const month = (this.getCurDateInfo().month || this.defaultDate[1]).replace(/月/, '');
const flag = year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
switch (month) {
case '01':
case '03':
case '05':
case '07':
case '08':
case '10':
case '12':
lastDay = 31
break;
case '04':
case '06':
case '09':
case '11':
lastDay = 30
break;
case '02':
lastDay = flag ? 29 : 28
break;
default:
array = '月份格式不正確蹦魔,請(qǐng)重新輸入!'
}
const afterDateArr = super.afterDateArr()
const _start = year == this.startDate[0] && month == this.startDate[1]
const _end = year == this.endDate[0] && month == this.endDate[1]
if (this.startDate[0] == this.endDate[0] && this.startDate[1] == this.endDate[1]) {
/*
* 開始的年和結(jié)束的年相同饲嗽,開始月和結(jié)束月相同
* 就取(開始日粘舟,結(jié)束日)
*/
array = super.getLoopArray(parseInt(this.startDate[2]), parseInt(this.endDate[2]))
} else {
if (_start) { // 開始年月
array = super.getLoopArray(parseInt(this.startDate[2]), lastDay)
} else if (_end) { // 結(jié)束年月
array = super.getLoopArray(1, parseInt(this.endDate[2]))
} else {
array = super.getLoopArray(1, lastDay)
}
}
return array;
}
/* 獲取小時(shí)數(shù)組*/
getHours() {
let array = []
const year = (this.getCurDateInfo().year || this.defaultDate[0]).replace(/年/, '');
const month = (this.getCurDateInfo().month || this.defaultDate[1]).replace(/月/, '');
const day = (this.getCurDateInfo().day || this.defaultDate[2]).replace(/日/, '');
const _start = year == this.startDate[0] && month == this.startDate[1] && day == this.startDate[2]
const _end = year == this.endDate[0] && month == this.endDate[1] && day == this.endDate[2]
const _equal = this.startDate[0] == this.endDate[0] && this.startDate[1] == this.endDate[1] && this.startDate[
2] == this.endDate[2]
if (_equal) {
/*
* 開始的年月日和結(jié)束的年月日都相同
* 就取(開始小時(shí)凉驻,結(jié)束小時(shí))
*/
array = super.getLoopArray(parseInt(this.startDate[3]), parseInt(this.endDate[3]))
} else {
if (_start) { // 開始年月日
array = super.getLoopArray(parseInt(this.startDate[3]), 23)
} else if (_end) { // 結(jié)尾年月日
array = super.getLoopArray(0, parseInt(this.endDate[3]))
} else {
array = super.getLoopArray(0, 23)
}
}
return array;
}
/* 獲取分鐘數(shù)組*/
getMinutes(years, months, days, hours) {
let array = []
const year = (this.getCurDateInfo().year || this.defaultDate[0]).replace(/年/, '');
const month = (this.getCurDateInfo().month || this.defaultDate[1]).replace(/月/, '');
const day = (this.getCurDateInfo().day || this.defaultDate[2]).replace(/日/, '');
const hour = (this.getCurDateInfo().hour || this.defaultDate[3]).replace(/時(shí)/, '');
const _start = year == this.startDate[0] && month == this.startDate[1] && day == this.startDate[2] && hour == this
.startDate[3]
const _end = year == this.endDate[0] && month == this.endDate[1] && day == this.endDate[2] && hour == this
.endDate[3]
const _equal = this.startDate[0] == this.endDate[0] && this.startDate[1] == this.endDate[1] && this.startDate[
2] == this.endDate[2] && this.startDate[3] == this.endDate[3]
if (_equal) {
/*
* 開始的年月日時(shí)和結(jié)束的年月日時(shí)都相同
* 就取(開始小時(shí)贝淤,結(jié)束小時(shí))
*/
array = super.getLoopArray(parseInt(this.startDate[4]), parseInt(this.endDate[4]))
} else {
if (_start) { // 開始年月日
array = super.getLoopArray(parseInt(this.startDate[4]), 59)
} else if (_end) { // 結(jié)尾年月日
array = super.getLoopArray(0, parseInt(this.endDate[4]))
} else {
array = super.getLoopArray(0, 59)
}
}
return array;
}
/* */
dispatch(index) {
let arr = []
switch (index) {
case 0:
arr = super.getLoopArray(this.startDate[0], this.endDate[0]);
break;
case 1:
arr = this.getMonths();
break;
case 2:
arr = this.getDays();
break;
case 3:
arr = this.getHours();
break;
case 4:
arr = this.getMinutes();
break;
default:
break;
}
return arr
}
/* 初始默認(rèn)數(shù)據(jù) */
render() {
const dateTime = []
const dateTimeArray = [
[],
[],
[],
[],
[]
];
/*年月日 時(shí)分秒*/
for (let i = 0; i < dateTimeArray.length; i++) {
dateTimeArray[i] = this.dispatch(i)
}
dateTimeArray.forEach((current, index) => {
const _index = current.indexOf(this.defaultDate[index])
dateTime.push(_index == -1 ? 0 : _index);
});
return {
dateTimeArray,
dateTime
}
}
}
function newDateTimePicker(startDateTime, endDateTime, pText) {
let newDateTimePicker = new dateTimePicker(startDateTime, endDateTime, pText)
return newDateTimePicker
}
module.exports = {
newDateTimePicker: newDateTimePicker,
}
wxml--組件內(nèi)容
<picker class="dateTimePicker" mode="multiSelector" value="{{dateTime}}" bindchange="changeDateTime" bindcolumnchange="changeDateTimeColumn" range="{{dateTimeArray}}">
<view class="tui-picker-detail wrap column-center">
<text style="color:{{(dateTimeWhole||params.pText)?'#999999':'#999999'}}">{{dateTimeWhole || params.pText || params.placeholder ||"請(qǐng)選擇時(shí)間"}}</text>
<!-- <image class="icon" src="/static/mine/meArrowRight.png" mode=""></image> -->
</view>
</picker>
js--組件內(nèi)容
const App = getApp();
//引入時(shí)間插件
const dateTimePicker = require('../../utils/dataPicker.js')
Component({
options: {
addGlobalClass: true,
},
/**
* 組件的屬性列表
*/
properties: {
params: {
type: Object,
value: {
placeholder: '請(qǐng)選擇時(shí)間',
startDateTime: '',
endDateTime: '',
pText: ''
}
},
},
/**
* 組件的初始數(shù)據(jù)
*/
data: {
dateTimeArray: null,
dateTime: null,
startDateTime: '',
endDateTime: '',
dateTimeWhole: '',
},
lifetimes: {
attached: function () {
this.setData({
startDateTime: this.data.params.startDateTime,
endDateTime: this.data.params.endDateTime
})
this.initData()
}
},
pageLifetimes: {
show: function () {
this.setData({
startDateTime: this.data.params.startDateTime,
endDateTime: this.data.params.endDateTime
})
this.initData()
},
hide: function () {
// 頁(yè)面被隱藏
},
resize: function (size) {
// 頁(yè)面尺寸變化
}
},
/**
* 組件的方法列表
*/
methods: {
initData(date) {
// 獲取完整的年月日 時(shí)分秒,以及默認(rèn)顯示的數(shù)組
this.data.unit = ['年', '月', '日', '時(shí)', '分']
this.data.dateTimePicker = dateTimePicker.newDateTimePicker(this.data.startDateTime, this.data.endDateTime, this.data.params.pText)
let obj = this.data.dateTimePicker.render();
let lastArray = obj.dateTimeArray;
let lastTime = obj.dateTime;
for (let i = 0; i < lastArray.length; i++) {
lastArray[i] = lastArray[i].map(m => m + this.data.unit[i])
}
this.data.dateTimeArray = lastArray
this.data.dateTime = lastTime
this.setData({
dateTimeArray: this.data.dateTimeArray,
dateTime: this.data.dateTime
})
},
changeDateTime(e) {
this.data.dateTime = e.detail.value
const year = this.data.dateTimeArray[0][this.data.dateTime[0]].replace(/年/, '')
const month = this.data.dateTimeArray[1][this.data.dateTime[1]].replace(/月/, '')
const day = this.data.dateTimeArray[2][this.data.dateTime[2]].replace(/日/, '')
const hour = this.data.dateTimeArray[3][this.data.dateTime[3]].replace(/時(shí)/, '')
const minute = this.data.dateTimeArray[4][this.data.dateTime[4]].replace(/分/, '')
// this.data.dateTimeWhole = `${year}-${month}-${day} ${hour}:${minute}`
this.data.dateTimeWhole = `${year}-${month}-${day} ${hour}:${minute}`
this.setData({
dateTimeWhole: this.data.dateTimeWhole,
})
console.log(this.data.dateTimeWhole)
this.triggerEvent('getDateString', this.data.dateTimeWhole)
},
changeDateTimeColumn(e) {
const {
column,
value
} = e.detail
// this.$set(this.data.dateTime, column, value)
let dateTimeTemp = 'dateTime[' + column + ']'
this.setData({
[dateTimeTemp]: value
})
this.data.dateTimePicker.setValue({
dateTimeArray: this.data.dateTimeArray,
dateTime: this.data.dateTime
})
for (let i = 1; i < this.data.dateTime.length; i++) {
if (column == i - 1) {
for (let j = i; j < this.data.dateTime.length; j++) {
// this.$set(this.data.dateTime, j, 0)
let temp = 'dateTime[' + j + ']'
this.setData({
[temp]: 0
})
}
}
let arr = this.data.dateTimePicker.dispatch(i).map(m => m + this.data.unit[i])
// this.$set(this.data.dateTimeArray, i, arr)
let temp1 = 'dateTimeArray[' + i + ']'
this.setData({
[temp1]: arr
})
}
this.setData({
dateTimeArray: this.data.dateTimeArray,
dateTime: this.data.dateTime
})
},
}
})
//組件css
/* pages/components/datePicker/datePicker.wxss */
.dateTimePicker {
text-align: left;
width: 300rpx;
}
.tui-picker-detail {
border-radius: 10rpx;
font-size: 20rpx;
/* width: 200rpx; */
text-align: right;
}
.icon {
width: 16rpx;
height: 32rpx;
}
頁(yè)面應(yīng)用方法