js实现日历简单算法
日历在我们的生活中扮演着十分重要的角色,上班、上学、约会都离不开日历。每年新年开始,人们都要更换新的日历,你想知道未来一年的这么多天是怎么被确定下来的吗?为什么去年的国庆节是星期五而今年的国庆节是星期三?那就来研究一下日历算法吧。本文将介绍日历的编排规则,确定某日是星期几的计算方法,以及如何在计算机上打印某一年的年历。
代码实现:
/**
* 初始化当天的日历数据 (没有参数默认当天)
* @method
* @param {Date} date
* @param {Number} line 日历中显示几行
* @returns [[],[]]
*/
function initMonthCalendar(dates, line = 6) {
var date = new Date(dates); // 初始时间格式
var y = date.getFullYear();
var m = date.getMonth();
var days = new Date(y, m + 1, 0).getDate(); // 获取这个月共有多少天
var firstDayWeek = new Date(y, m, 1).getDay(); // 月份第一天星期几
var arr = []; // 存储日历格式的数组
var n = []; // 日历格式中的一行
var d = 1; // 日历格式中的天数
// 先根据这个月第一天排星期几
// 把上个月剩下几天留在这个月的'奸细'放在最前头
for(let i = 0; i < firstDayWeek; i++) {
// new Date(2020, 8, 0) --> 9月没有0号 === 8月3127 n.unshift(getDate(y, m, 0 - i).getDate());
}
// 开启循环
// 一星期占一行,一行一个外循环
// 这里我默认想要6行
for (let j = 0; j < line; j++) {
// 一天占一个格子,最多一星期7个格子
// 这里我想要7个格子
for (let i = 0; i < 7; i++) {
if(d > days) {
// 这个月都放完了,该放什么?
// new Date(2020, 8, 31) --> 9月没有31 === 10月1 n.push(new Date(y, m, d++).getDate());
} else {
// 放置这个月的天数 n.push(d++);
}51
if (n.length == 7) break; // 放了7个格子该结束了
}
arr.push(n);
n = []; // 这一行放完了,清空ba
}
return arr;
}使用:
var calendar= initMonthCalendar('2020-09-19');
console.log(calendar);
// [
// [30, 31, 1, 2, 3, 4, 5]
// [6, 7, 8, 9, 10, 11, 12]
// [13, 14, 15, 16, 17, 18, 19]
// [20, 21, 22, 23, 24, 25, 26]
// [27, 28, 29, 30, 1, 2, 3]
// [4, 5, 6, 7, 8, 9, 10]
// ]获取这一年的日历:
var arr = [];
var y = new Date().getFullYear();
for (let i = 0; i < 12; i++) {
const d = '' + y + '-0' + (i + 1) + '-01';
arr.push(initMonthCalendar(d))
}
console.log(arr)本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!