微信小程序----日期时间选择器(自定义精确到分秒或时段)(MUI日期时间)

效果体验二维码(外联图片失效了)

如果文章对你有帮助的话,请打开微信扫一下二维码,点击一下广告,支持一下作者!谢谢!

声明

bug:由于此篇博客是在bindcolumnchange事件中做的值的改变处理,因此会出现当你选择时,没有点击确定,直接取消返回后,会发现选择框的值依然改变。
造成原因:这一点就是由于在bindcolumnchange事件做的值改变处理造成。
处理方法:如果需要确定后再改变值,请将bindcolumnchange事件中的处理操作放到bindchange事件中。
感谢:感谢qq_41906890指出的问题!

下载

DEMO下载

效果图

精确到秒的微信小程序日期时间选择器

实现原理

利用微信小程序的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>

WXSS

@import "../picker/picker.wxss";

使用的是三级联动选择器的样式,所以直接 import 引入!

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的值。

WXRUI体验二维码

WXRUI体验码

如果文章对你有帮助的话,请打开微信扫一下二维码,点击一下广告,支持一下作者!谢谢!

更多微信小程序实例

  • 45
    点赞
  • 212
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 124
    评论
### 回答1: 微信小程序demo是一份简单的点餐微信小程序的源码。该源码是基于微信小程序开发框架进行开发的,具有实际应用场景和功能。在该源码中,用户可以浏览菜单、选择菜品、添加到购物车并进行结算等操作。 该点餐微信小程序的主要功能包括以下几个方面: 1. 餐厅菜单展示:用户可以浏览餐厅提供的菜品,并查看菜品的详细信息,包括图片、名称、价格等。 2. 菜品选择:用户可以根据自己的需求,在菜单中选择自己喜欢的菜品并进行添加到购物车操作。 3. 购物车管理:用户可以在购物车中查看已添加的菜品列表,可以增加或减少数量,也可以删除不需要的菜品。 4. 结算功能:用户可以在购物车中选择结算,系统会计算出菜品的总价,并提供支付方式供用户选择。 5. 订单管理:用户可以查看自己的订单历史记录,包括订单的详细信息和状态。 该微信小程序demo源码是一个基础的点餐系统的雏形,可根据实际需求添加更多功能,比如添加菜品评论功能、菜品搜索功能、用户登录注册功能等,使其更加完善和实用。同时,该源码也提供了微信小程序开发的参考和学习价值,可以帮助开发者更好地理解和掌握微信小程序的开发技术。 ### 回答2: 点餐微信小程序demo源码是一种基于微信小程序开发的点餐系统的示例程序。该源码提供了用户点餐、浏览菜单、下单、结算等功能。 该小程序的实现过程主要包括以下几个关键步骤: 1. 用户注册与登录:用户可以通过微信登录或注册一个账号,并进行绑定。 2. 菜单浏览:用户可以在小程序中浏览餐厅的菜单,查看菜品图片、价格、口味等详细信息。 3. 购物车操作:用户可以选择菜品添加到购物车中,并对购物车中的商品进行增删改操作。 4. 下单与支付:用户可以点击下单按钮,将购物车中的商品生成订单,并选择支付方式进行支付。 5. 订单管理:用户可以在小程序中查看自己的历史订单,包括订单的状态、订单详情等,并可以进行评价、退款等操作。 6. 个人中心:用户可以在个人中心页面查看自己的信息,包括姓名、手机号码、地址等。 小程序的前端开发使用了微信小程序的框架,主要采用WXML、WXSS和JavaScript进行开发。后端采用了服务器端的技术来处理用户的请求,并与数据库进行交互。 总结来说,点餐微信小程序demo源码提供了一个完整的点餐系统的示例,可以帮助开发者理解微信小程序开发的流程和技术,并可以根据实际需求进行相关功能的扩展和修改。 ### 回答3: 微信小程序是一种可以在微信平台上进行开发和使用的应用程序。点餐微信小程序是一种常见的微信小程序,用于快速、方便地进行餐厅点餐服务。 点餐微信小程序通常包含以下功能: 1. 用户注册登录:用户可以通过微信账号快速注册登录到点餐小程序,以便享受更多服务和功能。 2. 餐厅菜单展示:通过小程序展示餐厅的菜单,包括菜品的名称、价格和描述等信息,用户可以通过浏览菜单选择自己喜欢的菜品。 3. 菜品搜索和筛选:为了方便用户查找菜品,小程序通常提供菜品搜索和筛选功能,用户可以根据关键词或特定的条件进行快速查找。 4. 菜品详情展示:用户可以点击菜品查看详细的菜品信息,包括图片、介绍、配料、口味等。 5. 购物车和下单:用户可以将选好的菜品添加到购物车中,小程序会实时计算总价。用户可以在购物车中增删菜品,最终选择下单。 6. 订单管理:用户可以查看自己的订单信息,包括当前订单状态、支付情况、配送时间等。同时,用户还可以对订单进行取消、修改等操作。 7. 支付功能:小程序通常会集成微信支付功能,用户可以通过微信支付进行菜品支付。 8. 评价和反馈:用户可以对菜品进行评价和反馈,为其他用户提供参考和改进意见。 以上是一个典型的点餐微信小程序的功能和特点,具体实现可以结合开发者的需求进行进一步的定制和扩展。希望以上回答能够帮助到您!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 124
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rattenking

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值