572 lines
16 KiB
JavaScript
572 lines
16 KiB
JavaScript
|
Component({
|
|||
|
/**
|
|||
|
* 组件的属性列表
|
|||
|
*/
|
|||
|
properties: {
|
|||
|
pickerShow: {
|
|||
|
type: Boolean,
|
|||
|
observer: function (val) { //弹出动画
|
|||
|
// console.log(this.data);
|
|||
|
if (val) {
|
|||
|
let animation = wx.createAnimation({
|
|||
|
duration: 500,
|
|||
|
timingFunction: "ease"
|
|||
|
});
|
|||
|
let animationOpacity = wx.createAnimation({
|
|||
|
duration: 500,
|
|||
|
timingFunction: "ease"
|
|||
|
});
|
|||
|
setTimeout(() => {
|
|||
|
animation.bottom(0).step();
|
|||
|
animationOpacity.opacity(0.7).step();
|
|||
|
this.setData({
|
|||
|
animationOpacity: animationOpacity.export(),
|
|||
|
animationData: animation.export()
|
|||
|
})
|
|||
|
}, 0);
|
|||
|
} else {
|
|||
|
let animation = wx.createAnimation({
|
|||
|
duration: 100,
|
|||
|
timingFunction: "ease"
|
|||
|
});
|
|||
|
let animationOpacity = wx.createAnimation({
|
|||
|
duration: 500,
|
|||
|
timingFunction: "ease"
|
|||
|
});
|
|||
|
animation.bottom(-320).step();
|
|||
|
animationOpacity.opacity(0).step();
|
|||
|
this.setData({
|
|||
|
animationOpacity: animationOpacity.export(),
|
|||
|
animationData: animation.export()
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
// 在picker滚动未停止前点确定,会使startValue数组各项归零,发生错误,这里判断并重新初始化
|
|||
|
// 微信新增了picker滚动的回调函数,已进行兼容
|
|||
|
if (this.data.startValue && this.data.endValue) {
|
|||
|
let s = 0,
|
|||
|
e = 0;
|
|||
|
let conf = this.data.config;
|
|||
|
|
|||
|
this.data.startValue.map(val => {
|
|||
|
if (val == 0) {
|
|||
|
s++
|
|||
|
}
|
|||
|
})
|
|||
|
this.data.endValue.map(val => {
|
|||
|
if (val == 0) {
|
|||
|
e++;
|
|||
|
}
|
|||
|
});
|
|||
|
let tmp = {
|
|||
|
hour: 4,
|
|||
|
minute: 5,
|
|||
|
second: 6
|
|||
|
}
|
|||
|
let n = tmp[conf.column];
|
|||
|
if (s >= n || e >= n) {
|
|||
|
this.initPick();
|
|||
|
this.setData({
|
|||
|
startValue: this.data.startValue,
|
|||
|
endValue: this.data.endValue,
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
},
|
|||
|
config: Object
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* 组件的初始数据
|
|||
|
*/
|
|||
|
data: {
|
|||
|
// pickerShow:true
|
|||
|
// limitStartTime: new Date().getTime()-1000*60*60*24*30,
|
|||
|
// limitEndTime: new Date().getTime(),
|
|||
|
// yearStart:2000,
|
|||
|
// yearEnd:2100
|
|||
|
},
|
|||
|
detached: function () {
|
|||
|
console.log("dele");
|
|||
|
},
|
|||
|
attached: function () {},
|
|||
|
ready: function () {
|
|||
|
this.readConfig();
|
|||
|
this.initPick(this.data.config || null);
|
|||
|
this.setData({
|
|||
|
startValue: this.data.startValue,
|
|||
|
endValue: this.data.endValue,
|
|||
|
});
|
|||
|
},
|
|||
|
/**
|
|||
|
* 组件的方法列表
|
|||
|
*/
|
|||
|
methods: {
|
|||
|
//读取配置项
|
|||
|
readConfig() {
|
|||
|
let limitEndTime = new Date().getTime();
|
|||
|
let limitStartTime = new Date().getTime() - 1000 * 60 * 60 * 24 * 30;
|
|||
|
if (this.data.config) {
|
|||
|
let conf = this.data.config;
|
|||
|
if (typeof conf.dateLimit == "number") {
|
|||
|
limitStartTime = new Date().getTime() - 1000 * 60 * 60 * 24 * conf.dateLimit;
|
|||
|
}
|
|||
|
if (conf.limitStartTime) {
|
|||
|
limitStartTime = new Date(conf.limitStartTime.replace(/-/g, '/')).getTime();
|
|||
|
}
|
|||
|
if (conf.limitEndTime) {
|
|||
|
limitEndTime = new Date(conf.limitEndTime.replace(/-/g, '/')).getTime();
|
|||
|
}
|
|||
|
this.setData({
|
|||
|
yearStart: conf.yearStart || 2000,
|
|||
|
yearEnd: conf.yearEnd || 2100,
|
|||
|
endDate: conf.endDate || false,
|
|||
|
dateLimit: conf.dateLimit || false,
|
|||
|
hourColumn: conf.column == "hour" ||
|
|||
|
conf.column == "minute" ||
|
|||
|
conf.column == "second",
|
|||
|
minColumn: conf.column == "minute" || conf.column == "second",
|
|||
|
secColumn: conf.column == "second"
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
let limitStartTimeArr = formatTime(limitStartTime);
|
|||
|
let limitEndTimeArr = formatTime(limitEndTime);
|
|||
|
|
|||
|
this.setData({
|
|||
|
limitStartTime,
|
|||
|
limitStartTimeArr,
|
|||
|
limitEndTime,
|
|||
|
limitEndTimeArr
|
|||
|
});
|
|||
|
},
|
|||
|
preventD: function () {
|
|||
|
|
|||
|
},
|
|||
|
//滚动开始
|
|||
|
handlePickStart: function (e) {
|
|||
|
this.setData({
|
|||
|
isPicking: true
|
|||
|
})
|
|||
|
},
|
|||
|
//滚动结束
|
|||
|
handlePickEnd: function (e) {
|
|||
|
this.setData({
|
|||
|
isPicking: false
|
|||
|
})
|
|||
|
},
|
|||
|
onConfirm: function () {
|
|||
|
//滚动未结束时不能确认
|
|||
|
if (this.data.isPicking) {
|
|||
|
return
|
|||
|
}
|
|||
|
let startTime = new Date(this.data.startPickTime.replace(/-/g, "/"));
|
|||
|
let endTime = new Date(this.data.endPickTime.replace(/-/g, "/"));
|
|||
|
if (startTime <= endTime || !this.data.endDate) {
|
|||
|
this.setData({
|
|||
|
startTime,
|
|||
|
endTime
|
|||
|
});
|
|||
|
let startArr = formatTime(startTime).arr;
|
|||
|
let endArr = formatTime(endTime).arr;
|
|||
|
let format0 = function (num) {
|
|||
|
return num < 10 ? '0' + num : num
|
|||
|
}
|
|||
|
|
|||
|
let startTimeBack =
|
|||
|
startArr[0] +
|
|||
|
"-" +
|
|||
|
format0(startArr[1]) +
|
|||
|
"-" +
|
|||
|
format0(startArr[2]) +
|
|||
|
" " +
|
|||
|
(this.data.hourColumn ? format0(startArr[3]) : "00") +
|
|||
|
":" +
|
|||
|
(this.data.minColumn ? format0(startArr[4]) : "00") +
|
|||
|
":" +
|
|||
|
(this.data.secColumn ? format0(startArr[5]) : "00");
|
|||
|
|
|||
|
let endTimeBack =
|
|||
|
endArr[0] +
|
|||
|
"-" +
|
|||
|
format0(endArr[1]) +
|
|||
|
"-" +
|
|||
|
format0(endArr[2]) +
|
|||
|
" " +
|
|||
|
(this.data.hourColumn ? format0(endArr[3]) : "00") +
|
|||
|
":" +
|
|||
|
(this.data.minColumn ? format0(endArr[4]) : "00") +
|
|||
|
":" +
|
|||
|
(this.data.secColumn ? format0(endArr[5]) : "00");
|
|||
|
|
|||
|
let time = {
|
|||
|
startTime: startTimeBack,
|
|||
|
endTime: endTimeBack
|
|||
|
};
|
|||
|
|
|||
|
//触发自定义事件
|
|||
|
this.triggerEvent("setPickerTime", time);
|
|||
|
this.triggerEvent("hidePicker", {});
|
|||
|
} else {
|
|||
|
wx.showToast({
|
|||
|
icon: "none",
|
|||
|
title: "时间不合理"
|
|||
|
});
|
|||
|
}
|
|||
|
},
|
|||
|
hideModal: function () {
|
|||
|
this.triggerEvent("hidePicker", {});
|
|||
|
},
|
|||
|
changeStartDateTime: function (e) {
|
|||
|
let val = e.detail.value;
|
|||
|
this.compareTime(val, "start");
|
|||
|
},
|
|||
|
|
|||
|
changeEndDateTime: function (e) {
|
|||
|
let val = e.detail.value;
|
|||
|
this.compareTime(val, "end");
|
|||
|
},
|
|||
|
//比较时间是否在范围内
|
|||
|
compareTime(val, type) {
|
|||
|
let h = val[3] ? this.data.HourList[val[3]] : "00";
|
|||
|
let m = val[4] ? this.data.MinuteList[val[4]] : "00";
|
|||
|
let s = val[5] ? this.data.SecondList[val[5]] : "00";
|
|||
|
let time =
|
|||
|
this.data.YearList[val[0]] +
|
|||
|
"-" +
|
|||
|
this.data.MonthList[val[1]] +
|
|||
|
"-" +
|
|||
|
this.data.DayList[val[2]] +
|
|||
|
" " +
|
|||
|
h +
|
|||
|
":" +
|
|||
|
m +
|
|||
|
":" +
|
|||
|
s;
|
|||
|
|
|||
|
let start = this.data.limitStartTime;
|
|||
|
let end = this.data.limitEndTime;
|
|||
|
let timeNum = new Date(time.replace(/-/g, '/')).getTime();
|
|||
|
let year, month, day, hour, min, sec, limitDate;
|
|||
|
let tempArr = []
|
|||
|
if (!this.data.dateLimit) {
|
|||
|
limitDate = [
|
|||
|
this.data.YearList[val[0]],
|
|||
|
this.data.MonthList[val[1]],
|
|||
|
this.data.DayList[val[2]],
|
|||
|
this.data.HourList[val[3]],
|
|||
|
this.data.MinuteList[val[4]],
|
|||
|
this.data.SecondList[val[5]]
|
|||
|
]
|
|||
|
} else if (type == "start" && timeNum > new Date(this.data.endPickTime.replace(/-/g, '/')) && this.data.config.endDate) {
|
|||
|
limitDate = formatTime(this.data.endPickTime).arr;
|
|||
|
|
|||
|
} else if (type == "end" && timeNum < new Date(this.data.startPickTime.replace(/-/g, '/'))) {
|
|||
|
limitDate = formatTime(this.data.startPickTime).arr;
|
|||
|
|
|||
|
} else if (timeNum < start) {
|
|||
|
limitDate = this.data.limitStartTimeArr.arr;
|
|||
|
|
|||
|
} else if (timeNum > end) {
|
|||
|
limitDate = this.data.limitEndTimeArr.arr;
|
|||
|
|
|||
|
} else {
|
|||
|
limitDate = [
|
|||
|
this.data.YearList[val[0]],
|
|||
|
this.data.MonthList[val[1]],
|
|||
|
this.data.DayList[val[2]],
|
|||
|
this.data.HourList[val[3]],
|
|||
|
this.data.MinuteList[val[4]],
|
|||
|
this.data.SecondList[val[5]]
|
|||
|
]
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
year = limitDate[0];
|
|||
|
month = limitDate[1];
|
|||
|
day = limitDate[2];
|
|||
|
hour = limitDate[3];
|
|||
|
min = limitDate[4];
|
|||
|
sec = limitDate[5];
|
|||
|
|
|||
|
if (type == "start") {
|
|||
|
this.setStartDate(year, month, day, hour, min, sec);
|
|||
|
} else if (type == "end") {
|
|||
|
//20210528 S
|
|||
|
let monthday = this.getDays(year, month);
|
|||
|
if(day == monthday) {
|
|||
|
if(month<11) {
|
|||
|
month += 1;
|
|||
|
day = 1;
|
|||
|
} else {
|
|||
|
year += 1;
|
|||
|
month = 1;
|
|||
|
day = 1;
|
|||
|
}
|
|||
|
} else {
|
|||
|
day += 1;
|
|||
|
}
|
|||
|
//20210528 E
|
|||
|
this.setEndDate(year, month, day, hour, min, sec);
|
|||
|
}
|
|||
|
},
|
|||
|
getDays: function (year, month) {
|
|||
|
let daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
|
|||
|
if (month === 2) {
|
|||
|
return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0 ?
|
|||
|
29 :
|
|||
|
28;
|
|||
|
} else {
|
|||
|
return daysInMonth[month - 1];
|
|||
|
}
|
|||
|
},
|
|||
|
initPick: function (initData) {
|
|||
|
const date = initData.initStartTime ? new Date(initData.initStartTime.replace(/-/g, '/')) : new Date();
|
|||
|
const endDate = initData.initEndTime ? new Date(initData.initEndTime.replace(/-/g, '/')) : new Date();
|
|||
|
// const startDate = new Date(date.getTime() - 1000 * 60 * 60 * 24);
|
|||
|
const startDate = date;
|
|||
|
const startYear = date.getFullYear();
|
|||
|
const startMonth = date.getMonth() + 1;
|
|||
|
const startDay = date.getDate();
|
|||
|
const startHour = date.getHours();
|
|||
|
const startMinute = date.getMinutes();
|
|||
|
const startSecond = date.getSeconds();
|
|||
|
|
|||
|
const endYear = endDate.getFullYear();
|
|||
|
const endMonth = endDate.getMonth() + 1;
|
|||
|
const endDay = endDate.getDate() + 1;
|
|||
|
const endHour = endDate.getHours();
|
|||
|
const endMinute = endDate.getMinutes();
|
|||
|
const endSecond = endDate.getSeconds();
|
|||
|
|
|||
|
let YearList = [];
|
|||
|
let MonthList = [];
|
|||
|
let DayList = [];
|
|||
|
let HourList = [];
|
|||
|
let MinuteList = [];
|
|||
|
let SecondList = [];
|
|||
|
|
|||
|
//设置年份列表
|
|||
|
for (let i = this.data.yearStart; i <= this.data.yearEnd; i++) {
|
|||
|
YearList.push(i);
|
|||
|
}
|
|||
|
|
|||
|
// 设置月份列表
|
|||
|
for (let i = 1; i <= 12; i++) {
|
|||
|
MonthList.push(i);
|
|||
|
}
|
|||
|
// 设置日期列表
|
|||
|
for (let i = 1; i <= 31; i++) {
|
|||
|
DayList.push(i);
|
|||
|
}
|
|||
|
// 设置时列表
|
|||
|
for (let i = 0; i <= 23; i++) {
|
|||
|
if (0 <= i && i < 10) {
|
|||
|
i = "0" + i;
|
|||
|
}
|
|||
|
HourList.push(i);
|
|||
|
}
|
|||
|
// 分|秒
|
|||
|
for (let i = 0; i <= 59; i++) {
|
|||
|
if (0 <= i && i < 10) {
|
|||
|
i = "0" + i;
|
|||
|
}
|
|||
|
MinuteList.push(i);
|
|||
|
SecondList.push(i);
|
|||
|
}
|
|||
|
|
|||
|
this.setData({
|
|||
|
YearList,
|
|||
|
MonthList,
|
|||
|
DayList,
|
|||
|
HourList,
|
|||
|
MinuteList,
|
|||
|
SecondList
|
|||
|
});
|
|||
|
|
|||
|
this.setStartDate(startYear, startMonth, startDay, startHour, startMinute, startSecond);
|
|||
|
this.setEndDate(endYear, endMonth, endDay, endHour, endMinute, endSecond);
|
|||
|
|
|||
|
//!!!
|
|||
|
// setTimeout(() => {
|
|||
|
// this.setStartDate(nowYear, nowMonth, nowDay, nowHour, nowMinute)
|
|||
|
// this.setEndDate(nowYear, nowMonth, nowDay, nowHour, nowMinute)
|
|||
|
// }, 0);
|
|||
|
},
|
|||
|
setPickerDateArr(type, year, month, day, hour, minute, second) {
|
|||
|
let yearIdx = 0;
|
|||
|
let monthIdx = 0;
|
|||
|
let dayIdx = 0;
|
|||
|
let hourIdx = 0;
|
|||
|
let minuteIdx = 0;
|
|||
|
let secondIdx = 0;
|
|||
|
|
|||
|
this.data.YearList.map((v, idx) => {
|
|||
|
if (parseInt(v) === year) {
|
|||
|
yearIdx = idx;
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
this.data.MonthList.map((v, idx) => {
|
|||
|
if (parseInt(v) === month) {
|
|||
|
monthIdx = idx;
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
// 重新设置日期列表
|
|||
|
let DayList = [];
|
|||
|
for (let i = 1; i <= this.getDays(year, month); i++) {
|
|||
|
DayList.push(i);
|
|||
|
}
|
|||
|
|
|||
|
DayList.map((v, idx) => {
|
|||
|
if (parseInt(v) === day) {
|
|||
|
dayIdx = idx;
|
|||
|
}
|
|||
|
});
|
|||
|
if (type == "start") {
|
|||
|
this.setData({
|
|||
|
startDayList: DayList
|
|||
|
});
|
|||
|
} else if (type == "end") {
|
|||
|
this.setData({
|
|||
|
endDayList: DayList
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
this.data.HourList.map((v, idx) => {
|
|||
|
if (parseInt(v) === parseInt(hour)) {
|
|||
|
hourIdx = idx;
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
this.data.MinuteList.map((v, idx) => {
|
|||
|
if (parseInt(v) === parseInt(minute)) {
|
|||
|
minuteIdx = idx;
|
|||
|
}
|
|||
|
});
|
|||
|
this.data.SecondList.map((v, idx) => {
|
|||
|
if (parseInt(v) === parseInt(second)) {
|
|||
|
secondIdx = idx;
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
return {
|
|||
|
yearIdx,
|
|||
|
monthIdx,
|
|||
|
dayIdx,
|
|||
|
hourIdx,
|
|||
|
minuteIdx,
|
|||
|
secondIdx
|
|||
|
};
|
|||
|
},
|
|||
|
setStartDate: function (year, month, day, hour, minute, second) {
|
|||
|
let pickerDateArr = this.setPickerDateArr(
|
|||
|
"start",
|
|||
|
year,
|
|||
|
month,
|
|||
|
day,
|
|||
|
hour,
|
|||
|
minute,
|
|||
|
second
|
|||
|
);
|
|||
|
this.setData({
|
|||
|
startYearList: this.data.YearList,
|
|||
|
startMonthList: this.data.MonthList,
|
|||
|
// startDayList: this.data.DayList,
|
|||
|
startHourList: this.data.HourList,
|
|||
|
startMinuteList: this.data.MinuteList,
|
|||
|
startSecondList: this.data.SecondList,
|
|||
|
startValue: [
|
|||
|
pickerDateArr.yearIdx,
|
|||
|
pickerDateArr.monthIdx,
|
|||
|
pickerDateArr.dayIdx,
|
|||
|
pickerDateArr.hourIdx,
|
|||
|
pickerDateArr.minuteIdx,
|
|||
|
pickerDateArr.secondIdx
|
|||
|
],
|
|||
|
startPickTime: this.data.YearList[pickerDateArr.yearIdx] +
|
|||
|
"-" +
|
|||
|
this.data.MonthList[pickerDateArr.monthIdx] +
|
|||
|
"-" +
|
|||
|
this.data.DayList[pickerDateArr.dayIdx] +
|
|||
|
" " +
|
|||
|
this.data.HourList[pickerDateArr.hourIdx] +
|
|||
|
":" +
|
|||
|
this.data.MinuteList[pickerDateArr.minuteIdx] +
|
|||
|
":" +
|
|||
|
this.data.SecondList[pickerDateArr.secondIdx]
|
|||
|
});
|
|||
|
},
|
|||
|
setEndDate: function (year, month, day, hour, minute, second) {
|
|||
|
let pickerDateArr = this.setPickerDateArr(
|
|||
|
"end",
|
|||
|
year,
|
|||
|
month,
|
|||
|
day,
|
|||
|
hour,
|
|||
|
minute,
|
|||
|
second
|
|||
|
);
|
|||
|
|
|||
|
this.setData({
|
|||
|
endYearList: this.data.YearList,
|
|||
|
endMonthList: this.data.MonthList,
|
|||
|
// endDayList: this.data.DayList,
|
|||
|
endHourList: this.data.HourList,
|
|||
|
endMinuteList: this.data.MinuteList,
|
|||
|
endSecondList: this.data.SecondList,
|
|||
|
endValue: [
|
|||
|
pickerDateArr.yearIdx,
|
|||
|
pickerDateArr.monthIdx,
|
|||
|
pickerDateArr.dayIdx,
|
|||
|
pickerDateArr.hourIdx,
|
|||
|
pickerDateArr.minuteIdx,
|
|||
|
pickerDateArr.secondIdx
|
|||
|
],
|
|||
|
endPickTime: this.data.YearList[pickerDateArr.yearIdx] +
|
|||
|
"-" +
|
|||
|
this.data.MonthList[pickerDateArr.monthIdx] +
|
|||
|
"-" +
|
|||
|
this.data.DayList[pickerDateArr.dayIdx] +
|
|||
|
" " +
|
|||
|
this.data.HourList[pickerDateArr.hourIdx] +
|
|||
|
":" +
|
|||
|
this.data.MinuteList[pickerDateArr.minuteIdx] +
|
|||
|
":" +
|
|||
|
this.data.SecondList[pickerDateArr.secondIdx]
|
|||
|
});
|
|||
|
},
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
|
|||
|
function formatTime(date) {
|
|||
|
|
|||
|
if (typeof date == 'string' || 'number') {
|
|||
|
try {
|
|||
|
date = date.replace(/-/g, '/') //兼容ios
|
|||
|
} catch (error) {}
|
|||
|
date = new Date(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 {
|
|||
|
str: [year, month, day].map(formatNumber).join('-') + ' ' + [hour, minute, second].map(formatNumber).join(':'),
|
|||
|
arr: [year, month, day, hour, minute, second]
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function formatNumber(n) {
|
|||
|
n = n.toString()
|
|||
|
return n[1] ? n : '0' + n
|
|||
|
}
|