微信小程序如何实现精确的日期时间选择器
这篇文章主要介绍了微信小程序如何实现精确的日期时间选择器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
声明
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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。