之前項目中有用到日歷控件,當時由于時間問題,是在網(wǎng)上找到一個demo,然后二次開發(fā)的,從那時就想著自己寫一個日歷控件。這篇文章說明日歷數(shù)據(jù)的處理,去除月份天數(shù)判斷以及是否閏年判斷。
設計(以最常用的按月份的日歷)
日歷其實大家都很熟悉,一切的設計都是從功能出發(fā),這是根本。日歷的功能分為兩大塊。
日歷頭部:當前年份/月份。 日歷主體:當前月份的具體的日期信息。 日歷主體的行數(shù):現(xiàn)在我們看到的日歷基本上為6行,因為一個月最多為31天,假設當前月的第一天為上一月最后一周的最后一天。如果是五行數(shù)據(jù)的話則只顯示了29天,這也是為什么顯示6行數(shù)據(jù)的原因。功能點
日歷初始渲染日期為當前月份 頭部的左右滑動,日歷數(shù)據(jù)需要顯示對應月份的信息 點擊日期本身可以進行相關(guān)數(shù)據(jù)操作,并且記錄操作內(nèi)容 可以根據(jù)調(diào)用這設置日歷的每周數(shù)據(jù)以星期*為開始,星期天或者星期一。首先思考日歷的核心問題
如何獲取當前日期的年份以及月份
/** * 獲取日歷header內(nèi)容 格式為:****年 **月 * @param {*} date */export const getHeaderContent = function (date) { let _date = new Date(date) return dateFormat(_date, 'yyyy年 MM月')}如何獲取當前月份需要顯示的42條數(shù)據(jù)(6*7),這42條數(shù)據(jù)是什么呢?
這個問題的核心是:當前月份顯示的42條數(shù)據(jù)的第一天是哪一天?
這個問題的解決思路還要從上面的設計說起,上面提到日歷主題的行數(shù)時,說到“假設當前月的第一天為上一月最后一周的最后一天”,那么42條數(shù)據(jù)顯示的內(nèi)容的第一條數(shù)據(jù)還要根據(jù)當前月的第一天是第一天所在周的第幾天。
舉例:2019-02-01
2月的第一天,星期五,所以當前月日歷的第一天為2019-02-01 - 5
var date = new Date()date.setDate(date.getDate() - date.getDay() + 1) // 獲取當前月的第一天為2019-01-28
這里有一問題是什么呢?
date.getDate()的值為0 - 6(0為周日,如果你的日歷也是將周日放在日歷的第一天,沒什么問題,可是在中國是將周日放在最后一天的),這也就意味著前面的實現(xiàn)還需要考慮日歷的放置順序,因為日歷是按照普通的周一到周日,還是周日到周一,我們獲取的當月日歷的第一天是不同的。所以上面的代碼還要依賴于日歷的排放順序。
這里的排放順序?qū)⑹侨諝v組件的第一個可被調(diào)用者控制的參數(shù)。這里我的設想是將該參數(shù)的傳入值與date.getDay()匹配。
0:周日 1:周一 ..... 5:周五 6:周六所以上面的公式為
date.setDate(date.getDate() - date.getDay() + x)
但是這里的x值加了之后的日期如果大于當前月份的第一天,那就需要將當前得到的日期數(shù)值再減去7天,這個原因就不用說明了吧。
新聞熱點
疑難解答
圖片精選