微信小程序 日歷控件

源碼地址: https://github.com/huangxiongbiao12/BGCalendar

一亩冬、效果圖

B71B80B9-0D2B-41A7-988E-E66A221DCDA6.png

二洪己、用法

1届良、進入界面的時候傳入startDate、endDate格式為yyyy-MM-dd字符串

var startDate = this.data.startDate;
    var endDate = this.data.endDate;
    console.log(startDate);
    console.log(endDate);
     wx.navigateTo({
        url: '../calender/index?startDate='+startDate+"&endDate="+endDate,
        success: function(res){
          // success
        },
      })

2操漠、返回處理
接收startDate收津、endDate格式為yyyy-MM-dd字符串處理界面

三、代碼

1浊伙、js代碼

var Data = require("../../utils/data.js");

Page({
  data: {
  },
  //==================加載數(shù)據(jù)================
  onLoad: function(options) {
    console.log(options.startDate);
    console.log(options.endDate);
    if(options.startDate&&options.endDate) {
       console.log(options.startDate);
      console.log(options.endDate);
        // var startDate = Data.formatDate(options.startDate,"yyyy-MM-dd");
        // var endDate =  Data.formatDate(options.endDate,"yyyy-MM-dd");
        this.data.startDate = options.startDate;
        this.data.endDate = options.endDate;
    }
    var date = new Date();
    //獲取當前的年月
    var cur_year = date.getFullYear();
    var cur_month = date.getMonth() + 1;
    var cur_day = date.getDate();
    console.log(cur_year);
    console.log(cur_month);
    console.log(cur_day);
    const weeks_ch = ['日', '一', '二', '三', '四', '五', '六'];
    //設置數(shù)據(jù)
    this.setData({
      org_year:date.getFullYear(),//現(xiàn)在時間的年月日
      org_month:date.getMonth(),
      org_day:cur_day,
      weeks_ch
    })
    this.initData(cur_year,cur_month);
  },
  //初始化數(shù)據(jù)
  initData:function(cur_year,cur_month) {
      // 計算最近三個月的對象
    var mObject0 = this.calculateDays(cur_year, cur_month);
    if(cur_month+1>12) {
      cur_year = cur_year+1;
      cur_month = 1;
    }else {
      cur_month = cur_month+1;
    }
    var mObject1 = this.calculateDays(cur_year, cur_month);
    if(cur_month+1>12) {//月不能大于12
      cur_year = cur_year+1;
      cur_month = 1;
    }else {
      cur_month = cur_month+1;
    }
    var mObject2 = this.calculateDays(cur_year, cur_month);
    this.setData({
      allDays:[mObject0,mObject1,mObject2]
    });
  },
  // =============獲取當月有多少天(下個月月初是多少)==========
  getThisMonthDays: function(year, month) {
    return new Date(year, month, 0).getDate();
  },
  // =============獲取當月第一周第一天是周幾===========
  getFirstDayOfWeek: function(year, month) {
    return new Date(Date.UTC(year, month - 1, 1)).getDay();
  },
  //====================計算當前年月空的幾天 =============
  calculateEmptyGrids: function(year, month) {
    const firstDayOfWeek = this.getFirstDayOfWeek(year, month);
    let empytGrids = [];
    if (firstDayOfWeek > 0) {
      for (let i = 0; i < firstDayOfWeek; i++) {
        empytGrids.push(i);
      }
    }
    return empytGrids;
  },
   // =====================計算當前年月有哪些天===========
   /**
    * 根據(jù)年月計算當前月的天對象狀態(tài)返回對象
    * mObject 年月對象
    * year  年
    * month 月
    * hasEmptyGrid  是都有空調
    * empytGrids  空天數(shù)字
    * days 所有日對象【】
    */
  calculateDays: function(year, month) {
    var mObject = {};//月對象
    mObject["year"] = year;
    mObject["month"] = month;
    //計算當前年月空的幾天
    var empytGrids = this.calculateEmptyGrids(year, month);
    if(empytGrids.length>0) {
      mObject["hasEmptyGrid"] = true;
      mObject["empytGrids"] = empytGrids;
    }else {
      mObject["hasEmptyGrid"] = false;
      mObject["empytGrids"] = [];
    }
    var days = [];
    var thisMonthDays = this.getThisMonthDays(year, month);//這個月有多少天
    //現(xiàn)在的時間
     var cusDate = new Date(this.data.org_year, this.data.org_month,this.data.org_day);
     var startDate;
     var endDate;
     if(this.data.startDate&&this.data.endDate) {
        startDate = Data.stringToDate(this.data.startDate);
        endDate = Data.stringToDate(this.data.endDate);
     }
     if(this.data.startDate){
       startDate = Data.stringToDate(this.data.startDate);
     }
    for (let i = 1; i <= thisMonthDays; i++) {
      var day = {};
      //加入的時間
      var date = new Date(year, month-1,i);
      // console.log(date)
      //status 0-不可選擇 1-當前時間 2-可選擇 3-被選中
      day["day"] = i;
      //比現(xiàn)在的時間比較是大于還是小于撞秋,小于則不可點擊
      var time = parseInt(Data.calculateTime(date,cusDate)); 
      if(time<0) {
          day["status"] = 0;
      }else if(time==0) {
          day["status"] = 1;
      }else {
          day["status"] = 2;
      }
      if(this.data.startDate&&this.data.endDate) {
        var stime = parseInt(Data.calculateTime(date,startDate)); 
        var etime = parseInt(Data.calculateTime(date,endDate));
        if(stime>=0&&etime<=0) {
            day["status"] = 3;
        }
      }else if(this.data.startDate){
         var stime = parseInt(Data.calculateTime(date,startDate)); 
        if(stime==0) {
            day["status"] = 3;
        }
      }
      days.push(day);
    }
    mObject["days"] = days;
    return mObject;
  },
// 選擇時間
  selectAction: function(e) {
      console.log(e.currentTarget.dataset.object);
      var year = e.currentTarget.dataset.object.year;
      var month = e.currentTarget.dataset.object.month;
      var day = e.currentTarget.dataset.idx+1;
      console.log(year);
      console.log(month);
      console.log(day);
      var selectDate = new Date(year,month-1,day);
      //現(xiàn)在的時間
     var cusDate = new Date(this.data.org_year, this.data.org_month,this.data.org_day);
      var time = parseInt(Data.calculateTime(selectDate,cusDate));
      console.log(time);
      if(time<0) {
        console.log("請選擇合理的時間");
         wx.showToast({
                  title: '請選擇合理的時間',
                  icon: 'error',
                  duration: 2000
          })
          return;
      }
      if(this.data.startDate&&this.data.endDate) {
          this.data.startDate = Data.formatDate(selectDate,"yyyy-MM-dd");
          this.data.endDate = null;
      }else if(this.data.startDate) {
          this.data.endDate = Data.formatDate(selectDate,"yyyy-MM-dd");
      }else {
           this.data.startDate = Data.formatDate(selectDate,"yyyy-MM-dd");
      } 
      this.initData(this.data.org_year, this.data.org_month+1);
      //返回選擇的時間(有起止時間的時候返回)
       if(this.data.startDate&&this.data.endDate) {
         console.log(this.data.startDate);
         console.log(this.data.endDate);
         var sDate = this.data.startDate;
         var eDate = this.data.endDate;
          var pages = getCurrentPages();
          var prevPage = pages[pages.length - 2]; //上一個頁面
          //直接調用上一個頁面的setData()方法,把數(shù)據(jù)存到上一個頁面中去
          prevPage.setData({
            startDate:sDate,
            endDate:eDate
          })
          wx.navigateBack({
            delta: 1, // 回退前 delta(默認為1) 頁面
            success: function(res){
              // success
            },
            fail: function(res) {
              // fail
            },
            complete: function(res) {
              // complete
            }
          })
       }
  }

});

utils/data.js部分代碼
/** 
//提供接口
module.exports = {
    formatDate:formatDate,//格式化日期
    stringToDate:stringToDate,//字符串轉日期
    calculateTime:calculateTime//比較時間差
}
   * 字符串轉時間(yyyy-MM-dd HH:mm:ss) 
   * result (分鐘) 
   */ 
  function stringToDate(fDate){  
    var fullDate = fDate.split("-");  
    return new Date(fullDate[0], fullDate[1]-1, fullDate[2], 0, 0, 0);  
  } 
  
  
/** 
     * 格式化日期 
     * @param date 日期 
     * @param format 格式化樣式,例如yyyy-MM-dd HH:mm:ss E 
     * @return 格式化后的金額 
     */
    function formatDate(date, format) { 
      var v = ""; 
      if (typeof date == "string" || typeof date != "object") { 
        return; 
      } 
      var year  = date.getFullYear(); 
      var month  = date.getMonth()+1; 
      var day   = date.getDate(); 
      var hour  = date.getHours(); 
      var minute = date.getMinutes(); 
      var second = date.getSeconds(); 
      var weekDay = date.getDay(); 
      var ms   = date.getMilliseconds(); 
      var weekDayString = ""; 
        
      if (weekDay == 1) { 
        weekDayString = "星期一"; 
      } else if (weekDay == 2) { 
        weekDayString = "星期二"; 
      } else if (weekDay == 3) { 
        weekDayString = "星期三"; 
      } else if (weekDay == 4) { 
        weekDayString = "星期四"; 
      } else if (weekDay == 5) { 
        weekDayString = "星期五"; 
      } else if (weekDay == 6) { 
        weekDayString = "星期六"; 
      } else if (weekDay == 7) { 
        weekDayString = "星期日"; 
      } 
  
      v = format; 
      //Year 
      v = v.replace(/yyyy/g, year); 
      v = v.replace(/YYYY/g, year); 
      v = v.replace(/yy/g, (year+"").substring(2,4)); 
      v = v.replace(/YY/g, (year+"").substring(2,4)); 
  
      //Month 
      var monthStr = ("0"+month); 
      v = v.replace(/MM/g, monthStr.substring(monthStr.length-2)); 
  
      //Day 
      var dayStr = ("0"+day); 
      v = v.replace(/dd/g, dayStr.substring(dayStr.length-2)); 
  
      //hour 
      var hourStr = ("0"+hour); 
      v = v.replace(/HH/g, hourStr.substring(hourStr.length-2)); 
      v = v.replace(/hh/g, hourStr.substring(hourStr.length-2)); 
  
      //minute 
      var minuteStr = ("0"+minute); 
      v = v.replace(/mm/g, minuteStr.substring(minuteStr.length-2)); 
  
      //Millisecond 
      v = v.replace(/sss/g, ms); 
      v = v.replace(/SSS/g, ms); 
        
      //second 
      var secondStr = ("0"+second); 
      v = v.replace(/ss/g, secondStr.substring(secondStr.length-2)); 
      v = v.replace(/SS/g, secondStr.substring(secondStr.length-2)); 
        
      //weekDay 
      v = v.replace(/E/g, weekDayString); 
      return v; 
    }
    /**
     * 計算兩個日期相差幾天
     * cusDate 當前時間
     * oriDate  比較時間
     * 返回 正數(shù)為cusDate>oriDate
     */
    function calculateTime(cusDate,oriDate) {
      var cusTime = cusDate.getTime();
      var oriTime = oriDate.getTime();
      return (cusTime-oriTime)/(1000*60*60*24)
    }

2嚣鄙、wxml代碼


<view class="weeks box">
    <view class="week fs28" wx:for="{{weeks_ch}}" wx:key="{{index}}" data-idx="{{index}}">{{item}}
    </view>
</view>

<block wx:for="{{allDays}}" wx:for-item="object">
    <!--年月-->
    <view class="date-area" style="">
        <view>{{object.year || "--"}} 年 {{object.month || "--"}} 月</view>
    </view>
    <!--日-->
    <view class="days">
        <!--循環(huán)空-->
        <view wx:if="{{object.hasEmptyGrid}}" class="grid white-color" wx:for="{{object.empytGrids}}" wx:key="{{index}}" data-idx="{{index}}"></view>
        <!--循環(huán)天-->
        <view class="grid white-color" wx:for="{{object.days}}" wx:key="{{index}}" data-idx="{{index}}"  data-object="{{object}}" bindtap="selectAction" style="">
            <!--天-->
            <view class="day {{item.status==0 ? 'disable' : 'enable'}} {{item.status==3 ? 'border-radius pink-bg' : ''}}">{{item.day}}</view>
            <!--今天-->
            <view wx:if="{{item.status==1}}" style="color:gray;font-size:12px;text-align:center;">今天</view>
        </view>
    </view>
</block>
  

3吻贿、icxx代碼

.box {
    display: flex;
    align-content: center;
    align-items: center;
}

.pink-color {
  color: rgb(64, 70, 128);
}
.white-color {
  color: #fff;
}
.fs24 {
  font-size: 24rpx;
}
.fs28 {
  font-size: 28rpx;
}
.fs32 {
  font-size: 32rpx;
}
.fs36 {
  font-size: 36rpx;
}
/* pages/calendar/calendar.wxss ====================================*/

.date-area {
    width: 100%;
    padding: 10px 0;
    text-align: center;
    border-top: 1px solid lightgray; 
    border-bottom: 1px solid lightgray;
}
.weeks {
    padding: 10px 0;
    height: 50rpx;
    line-height: 50rpx;
}
.week {
    flex: 1;
    text-align: center;
}
.days {
    display: flex;
    flex-wrap: wrap;
    align-content: center;
    align-items: center;
}
.grid {
    display: flex;
    width: 107.1428571429rpx;
    flex-direction: column;
    align-items: center;
    align-content: center;
    margin: 5px 0;
    text-align: center;
    /*border: 1px solid lightgray;*/
}
.day {
    width: 65rpx;
    padding: 13rpx 0; 
    color: black;
    font-size: 26rpx;
    font-weight: 200;
    text-align: center;
}
.border-radius {
    border-radius: 50%;
    position: relative;
    left: 0;
    top: 0;
    color: #fff;
}
.disable {
    color: lightgray;
}
.pink-bg {
    background-color: rgb(64, 70, 128);
}
.purple-bg {
    background-color: #b8b8f1;
}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市哑子,隨后出現(xiàn)的幾起案子舅列,更是在濱河造成了極大的恐慌,老刑警劉巖卧蜓,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帐要,死亡現(xiàn)場離奇詭異,居然都是意外死亡弥奸,警方通過查閱死者的電腦和手機榨惠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盛霎,“玉大人赠橙,你說我怎么就攤上這事》哒ǎ” “怎么了期揪?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長规个。 經(jīng)常有香客問我凤薛,道長姓建,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任枉侧,我火速辦了婚禮引瀑,結果婚禮上,老公的妹妹穿的比我還像新娘榨馁。我一直安慰自己憨栽,他們只是感情好,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布翼虫。 她就那樣靜靜地躺著屑柔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪珍剑。 梳的紋絲不亂的頭發(fā)上掸宛,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機與錄音招拙,去河邊找鬼唧瘾。 笑死,一個胖子當著我的面吹牛别凤,可吹牛的內容都是我干的饰序。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼规哪,長吁一口氣:“原來是場噩夢啊……” “哼求豫!你這毒婦竟也來了?” 一聲冷哼從身側響起诉稍,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蝠嘉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后杯巨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚤告,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年服爷,在試婚紗的時候發(fā)現(xiàn)自己被綠了杜恰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡层扶,死狀恐怖箫章,靈堂內的尸體忽然破棺而出烙荷,到底是詐尸還是另有隱情镜会,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布终抽,位于F島的核電站戳表,受9級特大地震影響桶至,放射性物質發(fā)生泄漏。R本人自食惡果不足惜匾旭,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一镣屹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧价涝,春花似錦女蜈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至居兆,卻和暖如春覆山,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背泥栖。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工簇宽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吧享。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓魏割,卻偏偏與公主長得像,于是被迫代替她去往敵國和親耙蔑。 傳聞我的和親對象是個殘疾皇子见妒,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內容