文件内容 dateplan.js 7 KB 7169 字符
// components/paste-picker/datetime-picker.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;
}

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
}
/**
 * 
 * @param {*} num 
 */
const formatLength = (num)=>{
  return num<10?`0${num}`:`${num}`;
}

// https://blog.csdn.net/weixin_49909441/article/details/116694845

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: ''
      },
      pickerName:{
        type:String,
        value:"dateplanpicker"
      }
  },
  // 私有数据,可用于模版渲染
  data: {
      glDateMutiIndex: [90, 0, 0,0],
      glYears: [],
      glMonths: [],
      glDays: [],
      glHours:["上午","下午","晚上"],
      animationData: {},// 动画
      showDatePickerPlus: false,
  },

  // 生命周期函数,可以为函数,或一个在methods段中定义的方法名
  attached: function () {
    // console.log("--- attached -- - ");
      // let glDateMutiIndex = this.data.glDateMutiIndex;
      // var _init = this.data.initDate;
      // if(_init){
      //   let [y,m,d] = _init.split(' ')[0].split('-');
      //   let [h,f,s] =_init.split(' ')[1].split(':');
      //   glDateMutiIndex = [glYear.indexOf(parseInt(y)), parseInt(m) - 1, parseInt(d) - 1,parseInt(h),parseInt(f),parseInt(s)];
      // }
      // let glDate = glDateHandler(glDateMutiIndex);
      // var _time = glInitTime();
      // this.setData({
      //     glDateMutiIndex: glDateMutiIndex,
      //     glYears: glDate.yearCol,
      //     glMonths: glDate.monthCol,
      //     glDays: glDate.dayCol,
      //     glHours:_time.hours,
      //     glMinutes:_time.minutes,
      //     glSeconds:_time.seconds
      // })
  },
  moved: function () {
  },
  detached: function () {
  },

  methods: {
      initPicker:function(){
       /**
       * 初始化阴阳历数据
       */
      let glDateMutiIndex = this.data.glDateMutiIndex;
      var _init = this.data.initDate;
      console.log('班次初始化日期',_init);
      if(!_init){
        //重置到当前日期
        var _date=new Date();
        _init =`${_date.getFullYear()}-${formatLength(_date.getMonth()+1)}-${formatLength(_date.getDate())} 上午`;
      }
      if(_init){
        let [y,m,d] = _init.split(' ')[0].split('-');
        let _pstr =_init.split(' ')[1];
        let _p = this.data.glHours.indexOf(_pstr);
        glDateMutiIndex = [glYear.indexOf(parseInt(y)), parseInt(m) - 1, parseInt(d) - 1,_p];
      }
      let glDate = glDateHandler(glDateMutiIndex);
      // var _hours=["上午","下午","晚上"];
      this.setData({
          glYears: glDate.yearCol,
          glMonths: glDate.monthCol,
          glDays: glDate.dayCol,
          // glHours:_hours
      });
      //因为这个时候的UI可能还没有处理好
      var _this =this;
      setTimeout(function(){
        _this.setData({
          glDateMutiIndex:glDateMutiIndex
        });
      },100);
      },
      /**
       * 公历数据改变监听
       */
      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,
          })
      },
      /**
       * 选择日期->确定
       */
      submitSelectDate: function () {
          let date = '';
          var _years = this.data.glYears;
          var _months =this.data.glMonths;
          var _days =this.data.glDays;
          var _hours =this.data.glHours;
          var _hit =this.data.glDateMutiIndex;
          date =`${_years[_hit[0]]}-${_months[_hit[1]]}-${_days[_hit[2]]} ${_hours[_hit[3]]}`;
          this.closeDatePickerPlus();
          var myEventDetail = {
              date: date,
              name:this.data.pickerName
          } // detail对象,提供给事件监听函数
          var myEventOption = {} // 触发事件的选项
          this.triggerEvent('submit', myEventDetail, myEventOption)
      },
      // 显示日期选择控件
      showDatePickerPlus: function () {
          this.initPicker();
          // console.log('执行显示 datetimepicker UI');
          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) {

      }
  }         
// https://blog.csdn.net/weixin_49909441/article/details/116694845
})
​ ​