📅控制台上的日历

79 阅读1分钟
/**
* 打印指定年月的日历
* @param {number} year - 年份,如2025
* @param {number} month - 月份,1-12
*/
function printCalendar(year, month) {
  // 获取当月第一天对象(注意月份参数是0-11,所以mont-1)
  const firstDay = new Date(year, month - 1, 1);
  // 获取当月最后一天对象(将month设为下个月,day设为0即可得到上个月最后一天)
  const lastDay = new Date(year, month, 0);
  
  // 打印日历标题(年、月)
  console.log(`      ${year}${month}月`);
  // 打印星期标题
  console.log("日 一 二 三 四 五 六");
  
  // 用于构建每一行的字符串
  let line = "";
  
  // 填充首行空白(当月1号是星期几,前面就空几格)
  for (let i = 0; i < firstDay.getDay(); i++) {
    // 每个日期占3个字符位置(2位数字+1空格)
    line += "   ";
  }
  
  // 循环打印每一天
  for (let day = 1; day <= lastDay.getDate(); day++) {
    // 日期小于10时前面补空格对齐,如" 1",否则直接使用如"10"
    line += (day < 10 ? " " + day : day) + " ";
    
    // 判断是否该换行:当日期+首日星期数能被7整除时换行,或是最后一天时换行
    if ((firstDay.getDay() + day) % 7 === 0 || day === lastDay.getDate()) {
      // 打印当前行
      console.log(line);
      // 重置行字符串
      line = ""; 
    }
  }
}

// 示例:打印2025年5月的日历
printCalendar(2025, 5);

执行这段代码将在控制台输出类似这样的效果:

      2025年5月
日 一 二 三 四 五 六
             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 31 
代码含义
new Date(2025, 4, 1)2025年5月1日
new Date(2025, 5, 0)2025年5月31日(6月的前一天)