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
|
||
} |