import constValue from '@/api/calendar/const'; import { clockFactory } from '@/api/calendar/utils'; import config from '@/api/calendar/config'; export const dayArr = [ '一', '二', '三', '四', '五', '六','日']; // export const dayArr = ['日', '一', '二', '三', '四', '五', '六']; /** * 日期信息的操作类 */ class DateClass { getWeek(week: number) { return `星期${dayArr[week]}`; } getCurrent() { const date = new Date(); return [date.getFullYear(), date.getMonth() + 1, date.getDate()]; } changeTimeStr(time: string) { return time.split('-').map((el) => Number(el)); } getCurrentStr(isZero: boolean = false) { const date = new Date(); return isZero ? date.getFullYear() + '-' + clockFactory(date.getMonth() + 1) + '-' + clockFactory(date.getDate()) : date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate(); } getHolidays(date: number[]) { return ( config.Holidays.indexOf(`${date[0]}${clockFactory(date[1])}${clockFactory(date[2])}`) > -1 ); } getWorks(date: number[]) { // console.log("日清杀杀杀",`${date[0]}${clockFactory(date[1])}${clockFactory(date[2])}`) // console.log("日清杀杀杀--》",config.Works.indexOf(`${date[0]}${clockFactory(date[1])}${clockFactory(date[2])}`)) // console.log("日清杀杀杀--》",( // config.Works.indexOf(`${date[0]}${clockFactory(date[1])}${clockFactory(date[2])}`) > // -1 // )) return ( config.Works.indexOf(`${date[0]}${clockFactory(date[1])}${clockFactory(date[2])}`) > -1 ); } /** * 获取公历月份天数 * @param {number} y 年 * @param {number} m 月 * @returns {number} 返回输入月份天数 */ solarMonth(y: number, m: number, d?: number) { if (m == 2) return (y % 4 == 0 && y % 100 != 0) || y % 400 == 0 ? 29 : 28; return constValue.solarMonth[m - 1]; } /** * 获得当前月份第一天是星期几 * @param {number} y 年 * @param {number} m 月 * @returns {number} 返回星期数字[0-6] */ solarWeeks(y: number, m: number) { return this.solarWeek(y, m, 1); } /** * 获取公历某一天是星期几 * @param {number} y 年 * @param {number} m 月 * @param {number} d 日 * @returns {number} 返回星期数字[0-6] */ solarWeek(y: number, m: number, d: number) { let date = new Date(y, m - 1, d); let week = date.getDay()-1; if(week < 0){ week = 6 } // console.log("获取公历某一天是星期几",y, m ,date,week,week < 0) return week; } /** * 返回农历月份通俗表示法 * @param {number} m 农历月 * @returns {string} 返回农历月份通俗表示法:'正月' */ toChinaMonth(m: number) { let r = String(m).slice(0, 1) == '0'; return r ? '\u95f0' + constValue.nStr3[m - 1] + '\u6708' : constValue.nStr3[m - 1] + '\u6708'; // 加上"月"字 } /** * 返回农历日期通俗表示法 * @param {number} d 农历日 * @returns {string} 返回农历日期通俗表示法:‘初一’ */ toChinaDay(d: number) { let str = d == 10 ? constValue.nStr2[0] : constValue.nStr2[Math.floor(d / 10)]; return str + (d % 10 ? constValue.nStr5[d % 10] : constValue.nStr5[10]); } /** * 农历年份转生肖 * @param {number} y 农历年 * @returns {string} 农历年份转生肖 */ getAnimal(y: number) { return constValue.Animals[(y - 4) % 12]; } /** * 返回公历日期所属星座 * @param {number} m 月 * @param {number} d 日 * @returns {string} 返回星座信息 */ toAstro(y: number, m: number, d: number) { let s = '\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf'; let arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22]; let i = m * 2 - (d < arr[m - 1] ? 2 : 0); return s.slice(i, i + 2) + '\u5ea7'; } /** * 根据公历日期返回农历日期 * @param {number} y 年 * @param {number} m 月 * @param {number} d 日 * @returns {string} 返回农历日期,如果是闰月则月份前含0 */ getLunars(y: number, m: number, d: number) { let date = new Date(y, m - 1, d), i, leap = 0, temp = 0; let offset = (Date.UTC(y, m - 1, d) - Date.UTC(1900, 0, 31)) / 86400000; for (i = 1900; i < 2101 && offset > 0; i++) { temp = this.lYearDays(i); offset -= temp; } if (offset < 0) { offset += temp; i--; } // 获取闰月 let year = i; leap = this.leapMonth(i); let isLeap = false; // 校验闰月 for (i = 1; i < 13 && offset > 0; i++) { if (leap > 0 && i == leap + 1 && !isLeap) { --i; isLeap = true; temp = this.leapDays(year); // 闰月天数 } else { temp = this.monthDays(year, i); // 普通月天数 } if (isLeap && i == leap + 1) isLeap = false; offset -= temp; } if (offset == 0 && leap > 0 && i == leap + 1) { if (isLeap) { isLeap = false; } else { isLeap = true; --i; } } if (offset < 0) { offset += temp; --i; } // 农历月 let month = isLeap ? '0' + i : i; // 农历日 let day = ++offset; return year + '-' + month + '-' + day; } /** * 返回农历年闰月,没有闰月则返回0 * @param {number} y 农历年 * @returns {number} 农历年闰月月份数字,没有闰月则返回0 */ leapMonth(y: number, m?: number, d?: number) { return constValue.lunarInfo[y - 1900] & 0xf; } /** * 返回农历年闰月的天数,没有闰月则返回0 * @param {number} y 农历年 * @returns {number} 闰月的天数,没有闰月则返回0 */ leapDays(y: number, m?: number, d?: number) { return this.leapMonth(y, m, d) ? (constValue.lunarInfo[y - 1900] & 0x10000 ? 30 : 29) : 0; } /** * 查询公历日期节日 * @param {number} m 月 * @param {number} d 日 * @returns {string | boolean} 返回节日信息,不是节日则返回false */ getSolarDay(m: number, d: number) { let solarDay: false | string = false; for (let i = 0; i < constValue.sFtv.length; i++) { if ( parseInt(constValue.sFtv[i].slice(0, 2)) == m && parseInt(constValue.sFtv[i].slice(2, 4)) == d ) { solarDay = constValue.sFtv[i].slice(5); } } return solarDay; } /** * 通过农历日期获取农历节日 * @param {number} y 农历年 * @param {number|string} m 农历月,如果是闰月则为字符串‘07’ * @param {number} d 农历日 * @returns {string|false} 返回农历节日,没有节日则返回false */ getlunarDay(y: number, m: number, d: number) { if (String(m).slice(0, 1) == '0') return false; //如果是闰月则没有节日 let lunarDay: false | string = false; for (let i = 0; i < constValue.lFtv.length; i++) { if ( parseInt(constValue.lFtv[i].slice(0, 2)) == m && parseInt(constValue.lFtv[i].slice(2, 4)) == d ) { lunarDay = constValue.lFtv[i].slice(5); } } // 判断是否为除夕 if (m == 12 && this.monthDays(y, m, d) == d) lunarDay = '除夕'; return lunarDay; } /** * 返回农历一年的天数 * @param {number} y 农历年份 * @returns {number} 一年的天数 */ lYearDays(y: number, m?: number, d?: number) { let i, sum = 348; for (i = 0x8000; i > 0x8; i >>= 1) { sum += constValue.lunarInfo[y - 1900] & i ? 1 : 0; } return sum + this.leapDays(y); } /** * 获取农历非闰月的总天数 * @param {number} y 农历年 * @param {number} m 农历月 * @returns {number} 返回农历非闰月的天数 */ monthDays(y: number, m: number, d?: number) { return constValue.lunarInfo[y - 1900] & (0x10000 >> m) ? 30 : 29; } /** * 获取公历年第n个节气日期 * @param {number} y 年 * @param {number} n 第几个节气 * @returns {string} 返回日期,0506 */ getTerm(y: number, n: number) { let _table = constValue.sTermInfo[y - 1900]; let _info = [ parseInt('0x' + _table.slice(0, 5)).toString(), parseInt('0x' + _table.slice(5, 10)).toString(), parseInt('0x' + _table.slice(10, 15)).toString(), parseInt('0x' + _table.slice(15, 20)).toString(), parseInt('0x' + _table.slice(20, 25)).toString(), parseInt('0x' + _table.slice(25)).toString() ]; let d = [ _info[0].slice(0, 1), _info[0].slice(1, 3), _info[0].slice(3, 4), _info[0].slice(4, 6), _info[1].slice(0, 1), _info[1].slice(1, 3), _info[1].slice(3, 4), _info[1].slice(4, 6), _info[2].slice(0, 1), _info[2].slice(1, 3), _info[2].slice(3, 4), _info[2].slice(4, 6), _info[3].slice(0, 1), _info[3].slice(1, 3), _info[3].slice(3, 4), _info[3].slice(4, 6), _info[4].slice(0, 1), _info[4].slice(1, 3), _info[4].slice(3, 4), _info[4].slice(4, 6), _info[5].slice(0, 1), _info[5].slice(1, 3), _info[5].slice(3, 4), _info[5].slice(4, 6) ]; return d[n - 1]; } /** @ 作者: 秦东 @ 时间: 2024-07-12 13:11:32 @ 功能: 判断公立是不是闰年 */ isLeapYear(year: number): boolean { return (year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0); } /** @ 作者: 秦东 @ 时间: 2024-07-15 09:00:20 @ 功能: 前进时间 @ 1: 月;2:周;3:天 */ moveTime(y: number, m: number, d: number,t?:number){ switch(t){ case 2: break; case 3: break; default: let month = m + 1 if(month > 12){ y = y + 1; m = 1 d = this.solarMonth(y,m) }else{ m = month let day = this.solarMonth(y,month) if(d > day){ d = day } } return [y,m,d] } } /** @ 作者: 秦东 @ 时间: 2024-07-12 11:50:37 @ 功能: 处理年月日回退数据 @ 1: 月;2:周;3:天 */ gobackTime(y: number, m: number, d: number,t?:number){ // console.log("计算时间--0--》",y,m,d,t) switch(t){ case 2: let startWeek = this.getMonday(y,m,d,'s',-1) let endWeek = this.getMonday(y,m,d,'e',-1) return { start:startWeek, end:endWeek } break; case 3: let day = d-1 if(day <= 0){ let month = m - 1 if(month <= 0){ y = y -1; m = 12 d = this.solarMonth(y,m) }else{ m = month d = this.solarMonth(y,month) } }else{ d = day } return [y,m,d] break; default: let month = m - 1 if(month <= 0){ y = y -1; m = 12 d = this.solarMonth(y,m) console.log("计算时间--1--》",y,m,d) }else{ m = month let day = this.solarMonth(y,month) if(d > day){ d = day } } return [y,m,d] break; } } /** @ 作者: 秦东 @ 时间: 2024-07-12 13:48:55 @ 功能: 任意日期获取周 */ getMonday = (year: number, month: number, taday: number,type: any, dates: any) => { // let now = new Date(); // let nowTime = now.getTime(); let dateStr = year + "-" + month + "-" + taday; // 要转换的日期字符串 // let nowTime = Date.parse(dateStr); let now = new Date(dateStr); let nowTime = now.getTime(); let day = now.getDay(); let longTime = 24 * 60 * 60 * 1000; let n = longTime * 7 * (dates || 0); let date: any = '' // console.log("now--->",now) // console.log("nowTime--->",nowTime) // console.log("day--->",day) // console.log("longTime--->",longTime) // console.log("n--->",n) if (type == "s") { date = nowTime - (day - 1) * longTime + n; }; if (type == "e") { date = nowTime + (7 - day) * longTime + n; }; date = new Date(date); let y: any = date.getFullYear(); let m: any = date.getMonth() + 1; let d: any = date.getDate(); // m = m < 10 ? "0" + m : m; // d = d < 10 ? "0" + d : d; let days = y + "-" + m + "-" + d; return [y, m, d]; } //获得上周的开始日期 // getLastWeekStartDate() } export default new DateClass();