微信小程序如何实现精确的日期时间选择器
这篇文章主要介绍了微信小程序如何实现精确的日期时间选择器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
声明
bug:由于此篇博客是在bindcolumnchange事件中做的值的改变处理,因此会出现当你选择时,没有点击确定,直接取消返回后,会发现选择框的值依然改变。
造成原因:这一点就是由于在bindcolumnchange事件做的值改变处理造成。
处理方法:如果需要确定后再改变值,请将bindcolumnchange事件中的处理操作放到bindchange事件中。
效果图
实现原理
利用微信小程序的picker组件的多列选择器实现!
WXML
时间选择器(选择时分) 午饭时间:{{time}} 日期选择器(选择年月日) 国庆出游:{{date}} 日期时间选择器(精确到秒) 选择日期时间:{{dateTimeArray[0][dateTime[0]]}}-{{dateTimeArray[1][dateTime[1]]}}-{{dateTimeArray[2][dateTime[2]]}}{{dateTimeArray[3][dateTime[3]]}}:{{dateTimeArray[4][dateTime[4]]}}:{{dateTimeArray[5][dateTime[5]]}} 日期时间选择器(精确到分) 选择日期时间:{{dateTimeArray1[0][dateTime1[0]]}}-{{dateTimeArray1[1][dateTime1[1]]}}-{{dateTimeArray1[2][dateTime1[2]]}}{{dateTimeArray1[3][dateTime1[3]]}}:{{dateTimeArray1[4][dateTime1[4]]}}
JS
vardateTimePicker=require('../../utils/dateTimePicker.js');
Page({
data:{
date:'2018-10-01',
time:'12:00',
dateTimeArray:null,
dateTime:null,
dateTimeArray1:null,
dateTime1:null,
startYear:2000,
endYear:2050
},
onLoad(){
//获取完整的年月日时分秒,以及默认显示的数组
varobj=dateTimePicker.dateTimePicker(this.data.startYear,this.data.endYear);
varobj1=dateTimePicker.dateTimePicker(this.data.startYear,this.data.endYear);
//精确到分的处理,将数组的秒去掉
varlastArray=obj1.dateTimeArray.pop();
varlastTime=obj1.dateTime.pop();
this.setData({
dateTime:obj.dateTime,
dateTimeArray:obj.dateTimeArray,
dateTimeArray1:obj1.dateTimeArray,
dateTime1:obj1.dateTime
});
},
changeDate(e){
this.setData({date:e.detail.value});
},
changeTime(e){
this.setData({time:e.detail.value});
},
changeDateTime(e){
this.setData({dateTime:e.detail.value});
},
changeDateTime1(e){
this.setData({dateTime1:e.detail.value});
},
changeDateTimeColumn(e){
vararr=this.data.dateTime,dateArr=this.data.dateTimeArray;
arr[e.detail.column]=e.detail.value;
dateArr[2]=dateTimePicker.getMonthDay(dateArr[0][arr[0]],dateArr[1][arr[1]]);
this.setData({
dateTimeArray:dateArr,
dateTime:arr
});
},
changeDateTimeColumn1(e){
vararr=this.data.dateTime1,dateArr=this.data.dateTimeArray1;
arr[e.detail.column]=e.detail.value;
dateArr[2]=dateTimePicker.getMonthDay(dateArr[0][arr[0]],dateArr[1][arr[1]]);
this.setData({
dateTimeArray1:dateArr,
dateTime1:arr
});
}
})
外部JS,dateTimePicker.js的引入
functionwithData(param){
returnparam<10?'0'+param:''+param;
}
functiongetLoopArray(start,end){
varstart=start||0;
varend=end||1;
vararray=[];
for(vari=start;i<=end;i++){
array.push(withData(i));
}
returnarray;
}
functiongetMonthDay(year,month){
varflag=year%400==0||(year%4==0&&year%100!=0),array=null;
switch(month){
case'01':
case'03':
case'05':
case'07':
case'08':
case'10':
case'12':
array=getLoopArray(1,31)
break;
case'04':
case'06':
case'09':
case'11':
array=getLoopArray(1,30)
break;
case'02':
array=flag?getLoopArray(1,29):getLoopArray(1,28)
break;
default:
array='月份格式不正确,请重新输入!'
}
returnarray;
}
functiongetNewDateArry(){
//当前时间的处理
varnewDate=newDate();
varyear=withData(newDate.getFullYear()),
mont=withData(newDate.getMonth()+1),
date=withData(newDate.getDate()),
hour=withData(newDate.getHours()),
minu=withData(newDate.getMinutes()),
seco=withData(newDate.getSeconds());
return[year,mont,date,hour,minu,seco];
}
functiondateTimePicker(startYear,endYear,date){
//返回默认显示的数组和联动数组的声明
vardateTime=[],dateTimeArray=[[],[],[],[],[],[]];
varstart=startYear||1978;
varend=endYear||2100;
//默认开始显示数据
vardefaultDate=date?[...date.split('')[0].split('-'),...date.split('')[1].split(':')]:getNewDateArry();
//处理联动列表数据
/*年月日时分秒*/
dateTimeArray[0]=getLoopArray(start,end);
dateTimeArray[1]=getLoopArray(1,12);
dateTimeArray[2]=getMonthDay(defaultDate[0],defaultDate[1]);
dateTimeArray[3]=getLoopArray(0,23);
dateTimeArray[4]=getLoopArray(0,59);
dateTimeArray[5]=getLoopArray(0,59);
dateTimeArray.forEach((current,index)=>{
dateTime.push(current.indexOf(defaultDate[index]));
});
return{
dateTimeArray:dateTimeArray,
dateTime:dateTime
}
}
module.exports={
dateTimePicker:dateTimePicker,
getMonthDay:getMonthDay
}
总结
1、将初始化列表以及初始化默认显示的数组放到dateTimePicker.js,防止页面逻辑太乱,而且可以多处使用;
2、判断是否为闰年,在三木表达式中,必须将能别400整除放在前边,因为或运算只要一个条件满足,就会返回true,不会执行后续表达式;
3、switchcase的合并方法需要注意格式;
4、如果只需要联动列表更新,二结果展示栏不更新,则在changeDateTimeColumn函数中只更新dateTimeArray的值。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。