微信小程序自定义封装picker实现直接显示年月日时分

效果如入下:

第一步,封装datepicker.js,可放在utils文件夹下。代码如下:

 

const formatNumber = n => {
  n = n.toString()
  return n[1] ? n : '0' + n
}
function getCurrentDate(){// 获取当前时间
  let date = new Date();   
  let currentYears=date.getFullYear();
  let currentMonths=date.getMonth()+1;
  let currentDay=date.getDate();
  let currentHours=date.getHours();
  let currentMinute=date.getMinutes();   
  
  var year=[currentYears].map(formatNumber)
  var mm=[currentMonths].map(formatNumber)
  var dd=[currentDay].map(formatNumber)
  var hh=[currentHours].map(formatNumber)
  var min=[currentMinute].map(formatNumber) 
  // return year+'年'+mm+'月'+dd+'日'+hh+':'+min;
  return year+'-'+mm+'-'+dd+' '+hh+':'+min; //2023-08-23-09:43
}
 
function GetMultiIndex(){ //一点开picker的选中设置  
	let arr=loadPickerData()
	console.log(arr);
	let date = new Date();   
	let currentYears=date.getFullYear();
  let currentMonths=date.getMonth()+1;
  let currentDay=date.getDate();
  let currentHours=date.getHours();
	let currentMinute=date.getMinutes();  
	console.log(currentYears);
	let yearindex=0
	let monthindex=0
	let dayindex=0
	let hoursindex=0
	let minuteindex=0
	arr.forEach((item,index)=>{
		switch (index) {
			case 0:
					currentYears=currentYears+'年'
					yearindex =item.indexOf(currentYears)
				break;
			case 1:
					currentMonths=[currentMonths].map(formatNumber)+'月'
					monthindex =item.indexOf(currentMonths)
				break;
			case 2:
					currentDay=[currentDay].map(formatNumber)+'日'
					dayindex =item.indexOf(currentDay)
				break;
			case 3:
					currentHours=[currentHours].map(formatNumber)+'时'
					hoursindex =item.indexOf(currentHours)
				break;
			case 4:
					currentMinute=[currentMinute].map(formatNumber)+'分'
					minuteindex =item.indexOf(currentMinute)
				break;
			default:
				break;
		}
	})
	//现在全部列,默认选第一个选项,可以直接在data里面定义 
	return [yearindex,monthindex,dayindex,hoursindex,minuteindex];
} 
 
function loadYears(startYear,endYear){//获取年份 
  /**
   * params参数
   * startYear 当前年份
   * endYear 循环结束月份 ,比如 5 年内 newDate().getFullYear() + 4,客户说只能预约两年内 
   * return 年份数组
  */
  let years=[];
  for (let i = startYear; i <= endYear; i++) {
    years.push("" + i+"年");
  } 
  // console.log(years,'years');
  return years;//返回年份数组 
}
 
 
function loadMonths(startMonth,endMonth){//获取月份
  // console.log(startMonth,endMonth,'startMonth,endMonth');
   /**
   * params参数
   * startMonth 当前月份
   * endMonth 循环结束月份,一般为 12个月
   * return 月份数组
  */ 
  let months=[];
  for (let i = startMonth; i <= endMonth; i++) {
    if (i < 10) {
      i = "0" + i;
    }
    months.push("" + i+"月");
  } 
  // console.log(months,'months');
  return months;//返回月份数组 
}
 
 
function loadDays(yearSelected,selectedMonths,startDay){ //获取日期  
  /**
   * params参数
   * currentYears 当前年份
   * selectedMonths 当前选择的月份
   * startDay   循环开始日 一般为1号, 希望从当前月份开始 ,startDay=currentDay
   * return 日期数组
  */
//  console.log(currentYears,selectedMonths,startDay,'111');
    let days=[];
    if (selectedMonths == 1 || selectedMonths == 3 || selectedMonths == 5 || selectedMonths == 7 || selectedMonths == 8 || selectedMonths == 10 || selectedMonths == 12) { //判断31天的月份,可以用正则简化
      for (let i = startDay; i <= 31; i++) {
        if (i < 10) {
          i = "0" + i;
        }
        days.push("" + i+'日');
      } 
    } else if (selectedMonths == 4 || selectedMonths == 6 || selectedMonths == 9 || selectedMonths == 11) { //判断30天的月份
      for (let i = startDay; i <= 30; i++) {
        if (i < 10) {
          i = "0" + i;
        }
        days.push("" + i+'日');
      } 
    } else if (selectedMonths == 2) { //判断2月份天数
      console.log('2月');
      let year = yearSelected 
      console.log(year,'year');
      if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {//闰年
        for (let i = startDay; i <= 29; i++) {
          if (i < 10) {
            i = "0" + i;
          }
          days.push("" + i+'日');
        }
      } else {//不是闰年
        for (let i = startDay; i <= 28; i++) {
          if (i < 10) {
            i = "0" + i;
          }
          days.push("" + i+'日');
        } 
      }
    }
    console.log(days,'days');
    return days;//返回日期数组
}
 
 
function loadHours(startHour,endHour){//获取小时
   /**
   * params参数
   * startHour 循环开始小时 一般为 0点, 希望从当前小时开始 startHour=currentHours
   * endHour 循环当前小时 ,一般为24个小时
   * return 小时数组
  */ 
  let hours=[];
   for (let i = startHour; i < endHour ; i++) {
    if (i < 10) {//看需求要不要加在前面+‘0’
      i = "0" + i;
    }
    hours.push("" + i+"时");
  }
  return hours;//返回小时数组 
}
 
 
function loadMinutes(startMinute,endMinute){//获取分钟
  /**
   * params参数
   * startMinute 循环开始分钟 一般为 0 开始,从当前分钟开始 startMinute=currentMinutes
   * endMinute 循环当前秒 ,一般为60分钟
   * return 分钟数组
  */  
 let minutes=[];
  for (let i = startMinute; i < endMinute ; i++) {
   if (i < 10) {
     i = "0" + i;
   }
   minutes.push("" + i+"分");
 }
 return minutes;//返回分钟数组 
}
 
//我没有用到秒,可以参考分钟的写法
 
function loadPickerData(){ //将Picker初始数据,开始时间设置为当前时间
  let date1 = new Date();   
  let currentYears=date1.getFullYear();
  let currentMonths=date1.getMonth()+1;
  let currentDay=date1.getDate();
  let currentHours=date1.getHours();
  let currentMinute=date1.getMinutes();  
  
  // 下面调用 自定义方法 
 
  //获取年份  loadYears(startYear,endYear)  
  //获取月份  loadMonths(startMonth,endMonth)
  //获取日期  loadDays(currentYears,currentMonths,startDay)
  //获取小时  loadHours(startHour,endHour)
  //获取分钟  loadMinutes(startMinute,endMinute)
  
  let years = loadYears(currentYears-2,date1.getFullYear() + 100)  //修改起始年份在两年前
  let months = loadMonths(1,12)   
  let days = loadDays(currentYears,currentMonths,1)  
  let hours = loadHours(0,24)  
  let minutes =  loadMinutes(0,60)
  return [years, months, days, hours, minutes]
}
 
//导出
module.exports = {
  loadPickerData:loadPickerData,
  getCurrentDate:getCurrentDate,
  GetMultiIndex:GetMultiIndex,
  loadYears:loadYears,
  loadMonths:loadMonths,
  loadDays:loadDays,
  loadHours:loadHours,
  loadMinutes:loadMinutes
}
 

第二步,wxml代码:

<picker  mode="multiSelector" bindchange="bindMultiPickerChange" bindcolumnchange="bindMultiPickerColumnChange" value="{{multiIndex}}" range="{{multiArray}}">
	 {{time}}
	<view class="triangle_border_down"> </view>
</picker>

js代码:

const datepicker = require('../datepicker/datepicker')
 
Page({
  data: {
    time: '选择预约时间',
    multiArray: [],//piker的item项
    multiIndex: [],//当前选择列的下标
    year: '',//选择的年
    month: '',//选择的月
    day: '',//选择的日
    hour: '',//选择的时
    minute: '',//选择的分
  },
  onShow: function () {
    //获取 datepicker 工具下的方法
    var loadPickerData = datepicker.loadPickerData()
    var getCurrentDate = datepicker.getCurrentDate()
    var GetMultiIndex = datepicker.GetMultiIndex()
 
    //这里写的是为了记录当前时间
    let year = parseInt(getCurrentDate.substring(0, 4));
    let month = parseInt(getCurrentDate.substring(5, 7));
    let day = parseInt(getCurrentDate.substring(8, 10));
    let hour = parseInt(getCurrentDate.substring(11, 13));
    let minute = parseInt(getCurrentDate.substring(14, 16));
    console.log(getCurrentDate);
    this.setData({
      multiArray: loadPickerData,//picker数组赋值,格式 [years, months, days, hours, minutes]
      multiIndex: GetMultiIndex,//设置pickerIndex,[0,0,0,0,0]
      time: getCurrentDate, //设置当前时间 ,currentYears+'-'+mm+'-'+dd+' '+hh+':'+min
      year: year,//记录选择的年
      month: month,//记录选择的月
      day: day,//记录选择的日
      hour: hour,//记录选择的时
      minute: minute,//记录选择的分 
    });
 
  },
  bindMultiPickerChange: function (e) { //时间日期picker选择改变后,点击确定 
    // console.log('picker发送选择改变,携带值为', e.detail.value)
    this.setData({
      multiIndex: e.detail.value
    })
    const index = this.data.multiIndex; // 当前选择列的下标
    const year = this.data.multiArray[0][index[0]];
    const month = this.data.multiArray[1][index[1]];
    const day = this.data.multiArray[2][index[2]];
    const hour = this.data.multiArray[3][index[3]];
    const minute = this.data.multiArray[4][index[4]];
    console.log(`${year}-${month}-${day} ${hour}:${minute}`); 
 
    this.setData({
      time: year.replace('年', '-') + month.replace('月', '-') + day.replace('日', '') + ' ' + hour.replace('时', '') + ':' + minute.replace('分', ''),
      year: year, //记录选择的年
      month: month, //记录选择的月
      day: day, //记录选择的日
      hour: hour, //记录选择的时
      minute: minute, //记录选择的分 
    })
    //console.log(this.data.time); 
  },
  bindMultiPickerColumnChange: function (e) { //监听picker的滚动事件
 
    // console.log('修改的列为', e.detail.column, ',值为', e.detail.value);
 
    let getCurrentDate = datepicker.getCurrentDate();//获取现在时间  
    let currentYear = parseInt(getCurrentDate.substring(0, 4));
    let currentMonth = parseInt(getCurrentDate.substring(5, 7));
    let currentDay = parseInt(getCurrentDate.substring(8, 10));
    let currentHour = parseInt(getCurrentDate.substring(11, 13));
    let currentMinute = parseInt(getCurrentDate.substring(14, 16));
 
    if (e.detail.column == 0) {//修改年份列 
      let yearSelected = parseInt(this.data.multiArray[e.detail.column][e.detail.value]);//当前选择的年份
 
      this.setData({
        multiIndex: [0, 0, 0, 0, 0],//设置pickerIndex
        year: yearSelected //当前选择的年份
      });
 
      if (yearSelected == currentYear) {//当前选择的年份==当前年份  
        var loadPickerData = datepicker.loadPickerData();
 
        this.setData({
          multiArray: loadPickerData,//picker数组赋值
          multiIndex: [0, 0, 0, 0, 0] //设置pickerIndex
        });
 
      } else {  // 选择的年份!=当前年份 
 
        // 处理月份
        let monthArr = datepicker.loadMonths(1, 12)
        // 处理日期
        let dayArr = datepicker.loadDays(currentYear, currentMonth, 1)
        // 处理hour
        let hourArr = datepicker.loadHours(0, 24);
        // 处理minute
        let minuteArr = datepicker.loadMinutes(0, 60)
 
        // 给每列赋值回去
        this.setData({
          ['multiArray[1]']: monthArr,
          ['multiArray[2]']: dayArr,
          ['multiArray[3]']: hourArr,
          ['multiArray[4]']: minuteArr
        });
      }
    }
    if (e.detail.column == 1) {//修改月份列
      let mon = parseInt(this.data.multiArray[e.detail.column][e.detail.value]); //当前选择的月份
      this.setData({
        month: mon  // 记录当前列
      })
 
      if (mon == currentMonth) {//选择的月份==当前月份 
        if (this.data.year == currentYear) {
 
          // 处理日期
          let dayArr = datepicker.loadDays(currentYear, mon, currentDay)
          // 处理hour
          let hourArr = datepicker.loadHours(currentHour, 24);
          // 处理minute
          let minuteArr = datepicker.loadMinutes(currentMinute, 60)
 
          this.setData({
            ['multiArray[2]']: dayArr,
            ['multiArray[3]']: hourArr,
            ['multiArray[4]']: minuteArr
          })
        } else {
          // 处理日期
          let dayArr = datepicker.loadDays(this.data.year, mon, 1)
          // 处理hour
          let hourArr = datepicker.loadHours(0, 24);
          // 处理minute
          let minuteArr = datepicker.loadMinutes(0, 60)
 
          this.setData({
            ['multiArray[2]']: dayArr,
            ['multiArray[3]']: hourArr,
            ['multiArray[4]']: minuteArr
          });
        }
      } else {  // 选择的月份!=当前月份 
        // 处理日期
        let dayArr = datepicker.loadDays(this.data.year, mon, 1) // 传入当前年份,当前选择的月份去计算日
        // 处理hour
        let hourArr = datepicker.loadHours(0, 24);
        // 处理minute
        let minuteArr = datepicker.loadMinutes(0, 60)
console.log(dayArr,'日期');
        this.setData({
          ['multiArray[2]']: dayArr,
          ['multiArray[3]']: hourArr,
          ['multiArray[4]']: minuteArr
        });
      }
    }
    if (e.detail.column == 2) {//修改日
      let dd = parseInt(this.data.multiArray[e.detail.column][e.detail.value]);//当前选择的日
      this.setData({
        day: dd
      })
      if (dd == currentDay) {//选择的日==当前日
        if (this.data.year == currentYear && this.data.month == currentMonth) {//选择的是今天 
 
          // 处理hour
          let hourArr = datepicker.loadHours(currentHour, 24);
          // 处理minute
          let minuteArr = datepicker.loadMinutes(currentMinute, 60)
 
          this.setData({
            ['multiArray[3]']: hourArr,
            ['multiArray[4]']: minuteArr
          });
 
        } else { //选择的不是今天 
          // 处理hour
          let hourArr = datepicker.loadHours(0, 24);
          // 处理minute
          let minuteArr = datepicker.loadMinutes(0, 60)
 
          this.setData({
            ['multiArray[3]']: hourArr,
            ['multiArray[4]']: minuteArr
          });
        }
      } else {  // 选择的日!=当前日 
        // 处理hour
        let hourArr = datepicker.loadHours(0, 24);
        // 处理minute
        let minuteArr = datepicker.loadMinutes(0, 60)
 
        this.setData({
          ['multiArray[3]']: hourArr,
          ['multiArray[4]']: minuteArr
        });
      }
    }
    if (e.detail.column == 3) {//修改时
      let hh = parseInt(this.data.multiArray[e.detail.column][e.detail.value]); //当前选择的时
      this.setData({
        hour: hh
      })
      if (hh == currentHour) {//选择的时==当前时 
        if (this.data.year == currentYear && this.data.month == currentMonth && this.data.month == currentMonth) {   // 选择的是今天
          // 处理minute
          let minuteArr = datepicker.loadMinutes(currentMinute, 60)
          this.setData({
            ['multiArray[4]']: minuteArr
          });
        } else { // 选择的不是今天
 
          // 处理minute
          let minuteArr = datepicker.loadMinutes(0, 60)
          this.setData({
            ['multiArray[4]']: minuteArr
          });
        }
      } else {//选择的时!=当前时 
        // 处理minute
        let minuteArr = datepicker.loadMinutes(0, 60)
        this.setData({
          ['multiArray[4]']: minuteArr
        });
      }
    }
    var data = {
      multiArray: this.data.multiArray,
      multiIndex: this.data.multiIndex
    };
    data.multiIndex[e.detail.column] = e.detail.value; //将值赋回去
    this.setData(data);  //将值赋回去
  }
})