微信小程序----日期时间选择器(自定义精确到分秒或时段)
声明
bug:由于此篇博客是在bindcolumnchange事件中做的值的改变处理,因此会出现当你选择时,没有点击确定,直接取消返回后,会发现选择框的值依然改变。
造成原因:这一点就是由于在bindcolumnchange事件做的值改变处理造成。
处理方法:如果需要确定后再改变值,请将bindcolumnchange事件中的处理操作放到bindchange事件中。
效果图

实现原理
利用微信小程序的picker组件的多列选择器实现!
WXML
<view class="tui-picker-content">
<view class="tui-picker-name">时间选择器(选择时分)</view>
<picker mode="time" value="{{time}}" start="09:00" end="17:30" bindchange="changeTime">
<view class="tui-picker-detail">
午饭时间: {{time}}
</view>
</picker>
</view> <view class="tui-picker-content">
<view class="tui-picker-name">日期选择器(选择年月日)</view>
<picker mode="date" value="{{date}}" start="2017-10-01" end="2017-10-08" bindchange="changeDate">
<view class="tui-picker-detail">
国庆出游: {{date}}
</view>
</picker>
</view> <view class="tui-picker-content">
<view class="tui-picker-name">日期时间选择器(精确到秒)</view>
<picker mode="multiSelector" value="{{dateTime}}" bindchange="changeDateTime" bindcolumnchange="changeDateTimeColumn" range="{{dateTimeArray}}">
<view class="tui-picker-detail">
选择日期时间: {{dateTimeArray[0][dateTime[0]]}}-{{dateTimeArray[1][dateTime[1]]}}-{{dateTimeArray[2][dateTime[2]]}} {{dateTimeArray[3][dateTime[3]]}}:{{dateTimeArray[4][dateTime[4]]}}:{{dateTimeArray[5][dateTime[5]]}}
</view>
</picker>
</view>
<view class="tui-picker-content">
<view class="tui-picker-name">日期时间选择器(精确到分)</view>
<picker mode="multiSelector" value="{{dateTime1}}" bindchange="changeDateTime1" bindcolumnchange="changeDateTimeColumn1" range="{{dateTimeArray1}}">
<view class="tui-picker-detail">
选择日期时间: {{dateTimeArray1[0][dateTime1[0]]}}-{{dateTimeArray1[1][dateTime1[1]]}}-{{dateTimeArray1[2][dateTime1[2]]}} {{dateTimeArray1[3][dateTime1[3]]}}:{{dateTimeArray1[4][dateTime1[4]]}}
</view>
</picker>
</view>
JS
 var dateTimePicker = 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(){
     // 获取完整的年月日 时分秒,以及默认显示的数组
     var obj = dateTimePicker.dateTimePicker(this.data.startYear, this.data.endYear);
     var obj1 = dateTimePicker.dateTimePicker(this.data.startYear, this.data.endYear);
     // 精确到分的处理,将数组的秒去掉
     var lastArray = obj1.dateTimeArray.pop();
     var lastTime = 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){
     var arr = 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) {
     var arr = 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的引入
 function withData(param){
   return param < 10 ? '0' + param : '' + param;
 }
 function getLoopArray(start,end){
   var start = start || 0;
   var end = end || 1;
   var array = [];
   for (var i = start; i <= end; i++) {
     array.push(withData(i));
   }
   return array;
 }
 function getMonthDay(year,month){
   var flag = 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 = '月份格式不正确,请重新输入!'
   }
   return array;
 }
 function getNewDateArry(){
   // 当前时间的处理
   var newDate = new Date();
   var year = 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];
 }
 function dateTimePicker(startYear,endYear,date) {
   // 返回默认显示的数组和联动数组的声明
   var dateTime = [], dateTimeArray = [[],[],[],[],[],[]];
   var start = startYear || 1978;
   var end = endYear || 2100;
   // 默认开始显示数据
   var defaultDate = 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、switch case的合并方法需要注意格式;
 4、如果只需要联动列表更新,二结果展示栏不更新,则在changeDateTimeColumn函数中只更新dateTimeArray的值。
微信小程序----日期时间选择器(自定义精确到分秒或时段)的更多相关文章
- 微信小程序日期时间选择器(精确到秒)
		
<picker mode="multiSelector" value="{{dateTime1}}" bindchange="changeDat ...
 - mpvue开发微信小程序之时间+日期选择器
		
最近在做微信小程序,技术栈为mpvue+iview weapp组件库. 因项目需求,要用到日期+时间选择器,iview组件库目前还未提供时间日期选择器的组件,小程序官方组件日期时间也是分开的,在简书上 ...
 - 自定义省市选择器 微信小程序多列选择器
		
由于微信小程序的选择器为省市区选择器共3列 如我仅需要省市2列的选择器 就需要我们另寻他法找来找去没有合适的 只能自己写了 1. 首先我们把所需要的省数据 市县数据放在一个 p_c.js 文件里面,使 ...
 - 微信小程序入坑之自定义组件
		
前言 最近接触微信小程序,再次之前公司用的前端框架是vue ,然后对比发现,开发小程序是各种限制,对于开发者非常不友好.各种槽点太多,完全吐槽不过来,所以在此不多说,打算下次专门写一篇文章吐槽一下.本 ...
 - 微信小程序省市区联动,自定义地区字典
		
最近在做一个项目的时候遇到了这么一个问题,就是省市区的联动呢,我们需要自定义字典来设置,那么微信小程序自带的省市区选择就不能用了,经过三根烟的催化,终于写出来了.下面献上代码示例. 首先是在utils ...
 - 微信小程序animation有趣的自定义动画
		
这几天在看代码时遇到了一些问题:关于微信小程序的animation自定义动画自己没有系统的学习过 做动画需要我们将一个复杂的动作过程,拆解为一步一步的小节过程 微信中已经为我们写好了端口我们只需要实例 ...
 - 微信小程序学习笔记四 自定义组件
		
1. 自定义组件 类似Vue或react中的自定义组件 小程序允许我们使用自定义组件的方式来构建页面 1.1 创建自定义组件 类似于页面, 一个自定义组件由json wxml wxss js 4个文件 ...
 - mpvue微信小程序多列选择器用法:实现省份城市选择
		
前言 微信小程序默认给我们提供了一个省市区的picker选择器,只需将mode设置为region即可 <picker mode="region" bindchange=&qu ...
 - 微信小程序(18)-- 自定义头部导航栏
		
最近做的项目涉及相应的页面显示相应的顶部标题,所以就需要自定义头部导航了. 首先新建一个顶部导航公用组件topnav,导航高度怎么计算? 1.wx.getSystemInfo 和 wx.getSyst ...
 
随机推荐
- 一次操作系统报错OutOfMemory Error的处理记录
			
在启动公司内嵌的tomcat容器时出现报错, 如下: # There is insufficient memory for the Java Runtime Environment to contin ...
 - BoundsChecker下载
			
首先,单独的BoundsChecker已经没了,被收购了,整合进了DevPartner 其次,DevPartner是收费软件,属于Borland的.官方地址:http://www.borland.co ...
 - windows常用命令行命令
			
https://blog.csdn.net/qq_32451373/article/details/77743869 打开"运行"对话框(Win+R),输入cmd,打开控制台命令窗 ...
 - P1019 聪聪理扑克
			
题目描述 聪聪的两个小伙伴灵灵和豪豪喜欢打扑克,什么斗地主.德州.牛牛,他们都玩的有模有样. 但是每次玩好扑克他们都不整理一下,所以整理扑克的任务就交到了聪聪的手上. 已知现在桌面上有 n 张扑克牌, ...
 - Vue与React比较
			
与React 相似: (1)虚拟DOM(Virtual DOM) 虚拟DOM的诞生是基于:改变真实的DOM状态远比改变一个JS对象的花销要大的多. 虚拟DOM是一个映射真实DOM的JS对象,当有变化产 ...
 - 关于hibernate5的映射文件和配置文件改变(转)
			
转自:https://blog.csdn.net/m0_37840000/article/details/78823716 配置文件: <!DOCTYPE hibernate-configura ...
 - There is no Action mapped for namespace [/] and action name [login] associate解决办法 .
			
写了一个JSP项目,在配置struts2时遇到了这个错误,在网上逛了一大圈后终于解决了这个问题.具体解决方法是: 1.struts.xml的名字和位置 这里特别提一点,很多人遇到这个错误都是名字错误, ...
 - Delphi XE里的StrPas要注意哦(要让StrPas知道哪里是字符串结束)
			
废话不多说了,直接上例子解说: procedure TForm1.Button1Click(Sender: TObject);var aa: array[0..1]of AnsiChar; bb1 ...
 - hadoop fs、hadoop dfs与hdfs dfs命令的区别
			
Hadoop fs:使用面最广,可以操作任何文件系统. hadoop dfs与hdfs dfs:只能操作HDFS文件系统相关(包括与Local FS间的操作),前者已经Deprecated,一般使用后 ...
 - 分布式架构基石RPC的实现原理
			
RPC的由来 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构 当网站流量很小时, ...