源碼地址: 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;
}