只为记录获取日历的函数,在插件不适合具体项目时手写日历
export interface ICalendar{
mealCalendarState?: string;
day: string | number;
active: boolean;
currentMonth: boolean;
formData: string | number;
week?: string | number;
year?: string | number;
month?: string | number;
allDays?: string | number;
isCatering?: boolean;
formDataMD?:string;
prev?:boolean
}
export const currenTime: ()=> number[] = () => {
const date = new Date();
const y = Number(date.getFullYear());
const m = Number(date.getMonth() + 1);
const d = Number(date.getDate());
return [y,m,d];
}
export const weekList = ['日', '一', '二', '三', '四', '五', '六']
export const week = [ '一', '二', '三', '四', '五', '六','日'];
export const months = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
export const isCurrentDay: (y, m) => (number) = (y, m) =>{
const currentDate = currenTime();
if(currentDate[0] === y && currentDate[1] === m) return currentDate[2]
else return 0
}
export const isLeapYear: (y: number)=>boolean = (y) =>{
const cond1 = y % 4 == 0;
const cond2 = y % 100 != 0;
const cond3 = y % 400 == 0;
return (cond1 && cond2) || cond3;
}
export const getCalendar:(y: number,m: number)=>ICalendar[] =(y, m) => {
let fd;
let cc = parseInt(String(y / 100));
let cy = y - cc * 100;
let cm = m;
const cd = 1;
if (m == 1 || m == 2) {
cc = parseInt(String((y - 1) / 100));
cy = y - 1 - cc * 100;
cm = 12 + m;
}
const csum = cy + parseInt(String(cy / 4)) + parseInt(String(cc / 4)) - 2 * cc + parseInt(String((26 * (cm + 1)) / 10)) + cd - 1;
if (csum < 0) {
fd = parseInt(String(((csum % 7) + 7) % 7));
} else {
fd = parseInt(String(csum % 7));
}
const cond = isLeapYear(y)
let allDays = months[m - 1];
if (cond && m == 2) {
allDays = 29;
}
let prevYear = y;
let prevMonth = m - 1;
if (m == 1) {
prevYear = y - 1;
prevMonth = 12;
}
let _prevMonth = prevMonth > 9 ? prevMonth : '0' + prevMonth;
let _m = m > 9 ? m : '0' + m;
let prevDays = months[prevMonth - 1];
if(prevMonth === 2 && cond) prevDays = 29;
const calendar: ICalendar[] = [];
const fdd = fd - 1 >= 0 ? fd-1 : fd+6;
for (let i = 1; i <= fdd; i++) {
let prevDay = prevDays - fdd + i;
let _prevDay = prevDay > 9 ? prevDay : '0' + prevDay;
const w = weekList[new Date(prevYear + '-' + _prevMonth + '-' + _prevDay).getDay() ]
calendar.push({
day: prevDay,
active: false,
currentMonth: false,
formData: prevYear + '-' + _prevMonth + '-' + _prevDay,
week:w,
formDataMD:_prevMonth + '-' + _prevDay,
prev:true
});
}
for (let i = 1; i <= allDays; i++) {
let _i = i > 9 ? i : '0' + i;
calendar.push({
day: i,
active: isCurrentDay(y, m) === i,
currentMonth: true,
formData: y + '-' + _m + '-' + _i,
week: week[((i + fdd - 1) % 7) % 7],
year: y,
month: m,
allDays: allDays,
isCatering: ((i + fdd - 1) % 7) % 7 < 5,
formDataMD: _m + '-' + _i
});
}
let nextYear = y;
let nextMonth = m + 1;
if (m == 12) {
nextYear = y + 1;
nextMonth = 1;
}
let _nextMonth = nextMonth > 9 ? nextMonth : '0' + nextMonth;
let takedie = calendar.length % 7;
if (7 - takedie > 0 && 7 - takedie < 7) {
for (let i = 1; i <= 7 - takedie; i++) {
let _i = i > 9 ? i : '0' + i;
const w = weekList[new Date(nextYear + '-' + _nextMonth + '-' + _i).getDay() ]
calendar.push({
day: i,
active: false,
currentMonth: false,
formData: nextYear + '-' + _nextMonth + '-' + _i,
week: w,
formDataMD: _nextMonth + '-' + _i
});
}
}
return calendar;
}
export const prevYear = (currentDate)=> {
return {
data:[currentDate[0] - 1, currentDate[1]],
calendar:getCalendar(currentDate[0] - 1, currentDate[1])
}
}
export const nextYear = (currentDate) => {
return {
data:[Number(currentDate[0]) + 1, Number(currentDate[1])],
calendar:getCalendar(Number(currentDate[0]) + 1, Number(currentDate[1]))
}
}
export const prevMonth = (currentDate) => {
let data: number[];
if (currentDate[1] - 1 == 0) {
data = [currentDate[0] - 1, 12];
} else {
data = [currentDate[0], currentDate[1] - 1];
}
return {
data,
calendar:getCalendar(data[0], data[1])
};
}
export const nextMonth = (currentDate) => {
let data: number[];
if (currentDate[1] == 12) {
data = [Number(currentDate[0]) + 1, 1];
} else {
data = [Number(currentDate[0]), Number(currentDate[1]) + 1];
}
return {
data,
calendar:getCalendar(data[0], data[1])
};
}