import { Lunar, LunarInfoType } from './calendar.uts' export type DateType = { fullDate : string; year : number; month : number; date : number; day : number; disabled : boolean; lunar : string; is_today : boolean; data ?: LunarInfoType } export class Calendar { private lunar:Lunar constructor() { this.lunar =new Lunar() } getDateInfo(time : string = '') : DateType { const nowDate = this.getDate(time) const lunar = this.getlunar(nowDate.year, nowDate.month, nowDate.date) const item : DateType = nowDate item.data = lunar return item } /** * 获取每周数据 * @param {Object} dateData */ getWeeks(dateData : string = '') : Array> { const dateObj = this.getDate(dateData) const year = dateObj.year const month = dateObj.month let firstDay = new Date(year, month - 1, 0).getDay() // 获取本月天数 let currentDay = new Date(year, month, 0).getDate() // 上个月末尾几天 const lastMonthDays = this._getLastMonthDays(firstDay, dateObj) // 本月天数 const currentMonthDys = this._currentMonthDys(currentDay, dateObj) // 本月剩余天数 const surplus = 42 - (lastMonthDays.length + currentMonthDys.length) // 下个月开始几天 const nextMonthDays = this._getNextMonthDays(surplus, dateObj) // const weeks = [] // 本月所有日期格子合并 let days : Array = [] for (let i = 0; i < lastMonthDays.length; i++) { const item = lastMonthDays[i] days.push(item) } for (let i = 0; i < currentMonthDys.length; i++) { const item = currentMonthDys[i] days.push(item) } for (let i = 0; i < nextMonthDays.length; i++) { const item = nextMonthDays[i] days.push(item) } let weeks : Array> = [] // 拼接数组 上个月开始几天 + 本月天数+ 下个月开始几天 for (let i = 0; i < days.length; i += 7) { const item : Array = days.slice(i, i + 7) weeks.push(item); } return weeks } /** * 获取上月剩余天数 */ _getLastMonthDays(firstDay : number, full : DateType) : Array { let dateArr : Array = [] for (let i = firstDay; i > 0; i--) { const month = full.month - 1 const beforeDate = new Date(full.year, month, -i + 1).getDate() let nowDate = full.year + '-' + month + '-' + beforeDate let item : DateType = this.getDate(nowDate) item.disabled = true dateArr.push(item) } return dateArr } /** * 获取本月天数 */ _currentMonthDys(dateData : number, full : DateType) : Array { let dateArr : Array = [] for (let i = 1; i <= dateData; i++) { let nowDate = full.year + '-' + full.month + '-' + i let item : DateType = this.getDate(nowDate) item.disabled = false dateArr.push(item) } return dateArr } /** * 获取下月天数 */ _getNextMonthDays(surplus : number, full : DateType) : Array { let dateArr : Array = [] for (let i = 1; i < surplus + 1; i++) { const month = full.month + 1 let nowDate = full.year + '-' + month + '-' + i let item : DateType = this.getDate(nowDate) item.disabled = true dateArr.push(item) } return dateArr } /** * 计算阴历日期显示 */ getlunar(year : number, month : number, date : number) : LunarInfoType { return this.lunar.solar2lunar(year, month, date) } /** * 获取任意时间 */ getDate(date : string = '', AddDayCount : number = 0, str : string = 'day') : DateType { let dd : Date = new Date() if (date !== '') { const datePart = date.split(" "); const dateData = datePart[0].split("-"); const year = parseInt(dateData[0]) const month = parseInt(dateData[1]) const day = parseInt(dateData[2]) dd = new Date(year, month - 1, day) } switch (str) { case 'day': dd.setDate(dd.getDate() + AddDayCount); break; case 'month': dd.setMonth(dd.getMonth() + AddDayCount); break; case 'year': dd.setFullYear(dd.getFullYear() + AddDayCount); break; } const y = dd.getFullYear(); const m = dd.getMonth() + 1; const d = dd.getDate(); let nowDate = y + '-' + m + '-' + d const lunarData = this.getlunar(y, m, d) const dataObj : DateType = { fullDate: nowDate, year: y, month: m, date: d, day: dd.getDay() + 1, lunar: lunarData.IDayCn, is_today: lunarData.isToday, disabled: false } return dataObj } }