Bootstrap

微信小程序--多种类型日期选择器(年月、月日...)

这里写自定义目录标题
微信小程序--多种类型日期选择器(年月、月日...)
时间选择器(年月日)
时间选择器(年月)
时间选择器(年)
时间选择器(月日)
时间选择器(月)
时间选择器(日)
微信小程序–多种类型日期选择器(年月、月日…)
在业务开发的过程中,有许多对picker选择器的使用场景,根据开发需要列出了几种常见的类型,可供大家共同参考、学习

时间选择器(年月日)
效果图:

wxml:

<picker mode="date" header-text="选择时间"  value="{{date}}" bindchange="bindDateChange">
  <view class="font30">
    <text class="color3">填报时间:</text>
    <text class="color6">{{date}}</text>
    <text class="timeIcon">▼</text>
  </view>
</picker>

js

data:{
  date:'2021-01-01',
},
bindDateChange: function(e) {
  console.log('picker发送选择改变,携带值为', e.detail.value)
  this.setData({
    date: e.detail.value
  })
},

wxss

.font30{
  font-size: 30rpx;
}

.color3{
  color: #333;
}

.color6{
  color: #666;
}

.timeIcon{
  color:#666;
  font-size:18rpx;
  margin-left: 5rpx;
}

时间选择器(年月)

效果图:

wxml:

<picker mode="date" header-text="选择时间" fields="month" value="{{date}}" bindchange="bindDateChange">
  <view class="font30">
    <text class="color3">填报时间:</text>
    <text class="color6">{{date}}</text>
    <text class="timeIcon">▼</text>
  </view>
</picker>

js

data:{
  date:'2021-01',
},
bindDateChange: function(e) {
  console.log('picker发送选择改变,携带值为', e.detail.value)
  this.setData({
    date: e.detail.value
  })
},

wxss

.font30{
  font-size: 30rpx;
}

.color3{
  color: #333;
}

.color6{
  color: #666;
}

.timeIcon{
  color:#666;
  font-size:18rpx;
  margin-left: 5rpx;
}

时间选择器(年)

wxml:

<picker mode="date" header-text="选择时间" fields="year" value="{{date}}" bindchange="bindDateChange">
  <view class="font30">
    <text class="color3">填报时间:</text>
    <text class="color6">{{date}}</text>
    <text class="timeIcon">▼</text>
  </view>
</picker>

js

data:{
  date:'2021',
},
bindDateChange: function(e) {
  console.log('picker发送选择改变,携带值为', e.detail.value)
  this.setData({
    date: e.detail.value
  })
},

wxss

.font30{
  font-size: 30rpx;
}

.color3{
  color: #333;
}

.color6{
  color: #666;
}

.timeIcon{
  color:#666;
  font-size:18rpx;
  margin-left: 5rpx;
}

时间选择器(月日)

(转载文章 如有雷同 纯属巧合)

这个官方没有给案例 只能自己自定义一个component组件(datePicker)

datePicker.wxml:

<view class='modal-mask' wx:if="{{ showDatePickerPlus }}" bindtap='closeDatePickerPlus'></view>
<view class='datepicker' wx:if="{{ showDatePickerPlus }}" animation="{{animationData}}">
  <view class='datepicker-header'>
    <view class='datepicker-header-left'  bindtap='closeDatePickerPlus'>取消</view>
    <view class='datepicker-header-right' bindtap='submitSelectDate'>确定</view>
  </view>
  <view class='datepicker-content'>
    <picker-view value="{{glDateNoYearMutiIndex}}" bindchange="bindDateGlNoYear">
      <picker-view-column class="picker-view-column">
        <view wx:for="{{glMonthsNoYear}}" wx:key="index">{{item}}月</view>
      </picker-view-column>
      <picker-view-column class="picker-view-column">
        <view wx:for="{{glDaysNoYear}}" wx:key="index">{{item}}日</view>
      </picker-view-column>
    </picker-view>
  </view>
</view>

datePicker.js:

// component/DatePicker/DatePicker.js

// 公历日期 1900年 - 今天
const glYear = [];
for (let i = 1900; i <= 2049; i++) {
    glYear.push(i)
}
// 公历月份
const glMonth = [];
for (let i = 1; i <= 12; i++) {
    glMonth.push(i < 10 ? ('0' + i) : i)
}
// 公历天份 28天
const glDay28 = [];
for (let i = 1; i <= 28; i++) {
    glDay28.push(i < 10 ? ('0' + i) : i)
}
// 公历天份 29天
const glDay29 = [];
for (let i = 1; i <= 29; i++) {
    glDay29.push(i < 10 ? ('0' + i) : i)
}
// 公历天份 30天
const glDay30 = [];
for (let i = 1; i <= 30; i++) {
    glDay30.push(i < 10 ? ('0' + i) : i)
}
// 公历天份 31天
const glDay31 = [];
for (let i = 1; i <= 31; i++) {
    glDay31.push(i < 10 ? ('0' + i) : i)
}

/**
 * 公历年月日处理
 */
function glDateHandler(arr) {
    let indexArr = arr
    let data = {
        "yearCol": glYear,
        "monthCol": glMonth,
        "dayCol": []
    }
    if (arr[1] == 0 || arr[1] == 2 || arr[1] == 4 || arr[1] == 6 || arr[1] == 7 || arr[1] == 9 || arr[1] == 11)
        data.dayCol = glDay31
    else if (arr[1] != 1)
        data.dayCol = glDay30
    else {
        let year = glYear[arr[0]];
        data.dayCol = glDay28;
        // 判断闰年
        if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
            data.dayCol = glDay29;
        }
    }
    return data;
}


/**
 * 公历月日处理 不带年份
 */
function glDateHandlerNoYear(arr) {
    let indexArr = arr
    let data = {
        "monthCol": [],
        "dayCol": []
    }
    data.monthCol = glMonth
    if (arr[0] == 0 || arr[0] == 2 || arr[0] == 4 || arr[0] == 6 || arr[0] == 7 || arr[0] == 9 || arr[0] == 11)
        data.dayCol = glDay31
    else if (arr[0] != 1)
        data.dayCol = glDay30
    else
        data.dayCol = glDay29
    return data;
}

const formatTime = date => {
    const year = date.getFullYear()
    const month = date.getMonth() + 1
    const day = date.getDate()
    return [year, month, day].map(formatNumber).join('-')
}

const formatNumber = n => {
    n = n.toString()
    return n[1] ? n : '0' + n
}

Component({
  behaviors: [],
  properties: {
      // 控制是否显示日期选择组件的flag
      showDatePickerPlus: {
          type: Boolean, // 类型(必填),目前接受的类型包括:String, Number, Boolean, Object, Array, null(表示任意类型)
          value: false, // 属性初始值(可选),如果未指定则会根据类型选择一个
          // 属性被改变时执行的函数(可选),也可以写成在methods段中定义的方法名字符串, 如:'_propertyChange'
          observer: function (newVal, oldVal) {
              if (newVal != oldVal) {
                  if (newVal)
                      this.showDatePickerPlus()
                  else
                      this.closeDatePickerPlus()
              }
          }
      },
      initDate: {
          type: String,
          value: formatTime(new Date())
      }
  },
  // 私有数据,可用于模版渲染
  data: {
      glDateMutiIndex: [90, 0, 0],
      glDateNoYearMutiIndex: [0, 0],
      glYears: [],
      glMonths: [],
      glMonthsNoYear: [],
      glDays: [],
      glDaysNoYear: [],
      animationData: {},// 动画
      showDatePickerPlus: false,
  },

  // 生命周期函数,可以为函数,或一个在methods段中定义的方法名
  attached: function () {
      /**
       * 初始化阴阳历数据
       */
      let glDateMutiIndex = this.data.glDateMutiIndex;
      let glDateNoYearMutiIndex = this.data.glDateNoYearMutiIndex;
      let [y,m,d] = this.data.initDate.split('-');
      glDateMutiIndex = [glYear.indexOf(parseInt(y)), parseInt(m) - 1, parseInt(d) - 1];
      let glDate = glDateHandler(glDateMutiIndex);
      glDateNoYearMutiIndex = [parseInt(m) - 1, parseInt(d) - 1];
      let glDateNoYear = glDateHandlerNoYear(glDateNoYearMutiIndex);
      this.setData({
          glDateMutiIndex: glDateMutiIndex,
          glDateNoYearMutiIndex: glDateNoYearMutiIndex,
          glYears: glDate.yearCol,
          glMonths: glDate.monthCol,
          glDays: glDate.dayCol,
          glMonthsNoYear: glDateNoYear.monthCol,
          glDaysNoYear: glDateNoYear.dayCol,
      })
  },
  moved: function () {
  },
  detached: function () {
  },

  methods: {
      /**
       * 公历数据改变监听
       */
      bindDateGl: function (e) {
          let value = e.detail.value;
          let data = glDateHandler(value);
          this.setData({
              glDateMutiIndex: value,
              glYears: data.yearCol,
              glMonths: data.monthCol,
              glDays: data.dayCol,
          })
      },
      /**
       * 公历不带年份数据改变监听
       */
      bindDateGlNoYear: function (e) {
          let value = e.detail.value;
          let data = glDateHandlerNoYear(value);
          this.setData({
              glDateNoYearMutiIndex: value,
              glMonthsNoYear: data.monthCol,
              glDaysNoYear: data.dayCol
          })
      },
      /**
       * 选择日期->确定
       */
      submitSelectDate: function () {
          let date = '';
          date = (this.data.glMonths[this.data.glDateNoYearMutiIndex[0]] + '-' + this.data.glDaysNoYear[this.data.glDateNoYearMutiIndex[1]])
          
          this.closeDatePickerPlus();
          var myEventDetail = {
              dateStr: date,
          } // detail对象,提供给事件监听函数
          var myEventOption = {} // 触发事件的选项
          this.triggerEvent('submit', myEventDetail, myEventOption)
      },
      // 显示日期选择控件
      showDatePickerPlus: function () {
          var animation = wx.createAnimation({
              duration: 160,
              timingFunction: 'linear',
              delay: 0
          })
          this.animation = animation

          animation.translateY(280).step({duration: 0})

          this.setData({
              animationData: animation.export(),
              showDatePickerPlus: true
          })
          setTimeout(function () {
              animation.translateY(0).step()
              this.setData({
                  animationData: animation.export(),
              })
          }.bind(this), 160)
      },
      // 隐藏日期选择控件
      closeDatePickerPlus: function () {
          this.animation.translateY(280).step()
          this.setData({
              animationData: this.animation.export(),
          })
          setTimeout(function () {
              this.setData({
                  showDatePickerPlus: false,
              })
          }.bind(this), 120)
      },
      onMyButtonTap: function () {
          this.setData({
              // 更新属性和数据的方法与更新页面数据的方法类似
          })
      },
      _propertyChange: function (newVal, oldVal) {

      }
  }

})

datePicker.JSON:

{
  "component": true,
  "usingComponents": {}
}
/* component/DatePicker/DatePicker.wxss */
/* 日期选择器 */
.modal-mask {
  width: 100%;
  height: 100%;
  position: fixed;
  top: 0;
  left: 0;
  background: #000;
  opacity: 0.3;
  overflow: hidden;
  z-index: 500;
  color: #fff;
}
.datepicker {
  position: fixed;
  bottom: 0;
  left: 0;
  width: 100%;
  background: #fff;
  z-index: 501;
}
.datepicker-header {
  display: flex;
  height: 80rpx;
  background-color: #e9e9e9;
  color: #2f80f2;
  align-items: center;
  justify-content: space-between;
  font-size: 28rpx;
}
.datepicker-header-left {
  height: 100%;
  margin-left: 30rpx;
  display: flex;
  align-items: center;
}
.datepicker-header-right {
  margin-right: 40rpx;
}
.datetype-toggle {
  background: #fff;
  border: 1rpx solid #2f80f2;
  display: flex;
  margin-right: 50rpx;
}
.datetype-item {
  width: 80rpx;
  height: 50rpx;
  display: flex;
  align-items: center;
  justify-content: center;
}
.datetype-select {
  background: #2f80f2;
  color: #fff;
}
.datepicker-content {
  height: 100%;
}
picker-view {
  width: 100%; 
  height: 480rpx;
}
.picker-view-column {
  text-align:center;
  line-height: 80rpx;
  color: #222;
  font-size: 28rpx;
}

index.wxml

<view class="font30 holidaysTime" bindtap='showDatePickerPlus'>
  <text class="color3">选择时间:</text>
  <text class="color6">{{dateInfo.dateStr}}</text>
  <text class="timeIcon">▼</text>
  <datepicker-plus bind:submit='submit' showDatePickerPlus='{{show}}' initDate="2018-01-01"></datepicker-plus>
</view>

index.js

data:{
  show: false,
  dateInfo: {dateStr:'01-01'}
},
submit: function(e) {
  console.log(e);
  console.log('日期字符串:' + e.detail.dateStr)
  this.setData({
    dateInfo: e.detail
  })
  console.log('dateInfo',e.detail);
},
showDatePickerPlus: function() {
  this.setData({
    show: true
  })
},

index.JSON

"usingComponents": {
  "datepicker-plus": "/component/DatePicker/DatePicker"
},

index.WXSS

.holidaysTime{
  margin-bottom: 60rpx;
}
.font30{
  font-size: 30rpx;
}

.color3{
  color: #333;
}

.color6{
  color: #666;
}

.timeIcon{
  color:#666;
  font-size:18rpx;
  margin-left: 5rpx;
}

时间选择器(月)

效果图:

wxml:

<picker bindchange="bindPickerdateChange" value="{{index}}" range="{{monthArr}}">
  <view class="font30">
    <text class="color3 margin10">月份</text>
    <text class="color6">{{monthArr[index]}}</text>
    <text class="color6 timeIcon">▼</text>
  </view>
</picker>

js

data:{
   index:0,
   monthArr:['01月','02月','03月','04月','05月','06月','07月','08月','09月','10月','11月','12月'],
},
bindDateChange: function(e) {
  console.log('picker发送选择改变,携带值为', e.detail.value)
  this.setData({
    date: e.detail.value
  })
},

wxss

.font30{
  font-size: 30rpx;
}

.color3{
  color: #333;
}

.color6{
  color: #666;
}

.timeIcon{
  color:#666;
  font-size:18rpx;
  margin-left: 5rpx;
}

时间选择器(日)

效果图:

wxml:

<picker bindchange="bindPickerdateChange" value="{{index}}" range="{{dayArr}}">
  <view class="font30">
    <text class="color3 margin10">日期</text>
    <text class="color6">{{dayArr[index]}}</text>
    <text class="color6 timeIcon">▼</text>
  </view>
</picker>

js

data:{
   index:0,
   dayArr:['01日','02日','03日','04日','05日','06日','07日','08日','09日','10日','11日','12日','13日','14日','15日','16日','17日','18日','19日','20日','21日','22日','23日','24日','25日','26日','27日','28日','29日','20日','21日'],
},

bindPickerdateChange: function(e) {
  console.log('picker发送选择改变,携带值为', e.detail.value)
  this.setData({
    index: e.detail.value
  })
},

wxss

.font30{
  font-size: 30rpx;
}

.color3{
  color: #333;
}

.color6{
  color: #666;
}

.timeIcon{
  color:#666;
  font-size:18rpx;
  margin-left: 5rpx;
}

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;