You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java日历程序日期对齐错误及getStartDay符号找不到问题排查

一、解决「cannot find symbol」错误

你提供的代码中getStartDay方法定义在printMonthBody方法之后,Java编译器处理printMonthBody时还未识别到该方法,因此报错。有两种解决方式:

  • 将getStartDay方法移动到printMonthBody方法之前;
  • 在printMonthBody方法前提前声明方法签名:static int getStartDay(int year, int month);

二、解决日期对齐问题

当前日期输出未固定宽度,单数字与双数字日期占用字符数不一致,导致排版混乱。改用printf格式化输出,固定每个日期的占位宽度即可实现对齐:

修改printMonthBody方法的两处逻辑:

  1. 调整前置空格循环,每个星期列对应4个字符宽度:
for (i = 0; i < startDay; i++) {
    System.out.print("    "); // 4个空格匹配日期宽度
}
  1. 替换日期输出逻辑,用格式化输出固定宽度:
for (i = 1; i <= numberOfDaysInMonth; i++) {
    System.out.printf("%4d", i); // 每个日期占4个字符,右对齐
    if ((i + startDay) % 7 == 0) {
        System.out.println();
    }
}

修正后的完整代码

import java.util.Scanner;

public class PrintCalendar3 {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter full year (e.g., 2016): ");
        int year = scanner.nextInt();
        System.out.print("Enter month in number between 1 and 12: ");
        int month = scanner.nextInt();
        printMonth(year, month);
    }

    static void printMonth(int year, int month) {
        printMonthTitle(year, month);
        printMonthBody(year, month);
    }

    static void printMonthTitle(int year, int month) {
        System.out.println(" " + getMonthName(month) + " " + year);
        System.out.println("-----------------------------");
        System.out.println(" Sun Mon Tue Wed Thu Fri Sat");
    }

    static String getMonthName(int month) {
        String monthName = null;
        switch (month) {
            case 1: monthName = "January"; break;
            case 2: monthName = "February"; break;
            case 3: monthName = "March"; break;
            case 4: monthName = "April"; break;
            case 5: monthName = "May"; break;
            case 6: monthName = "June"; break;
            case 7: monthName = "July"; break;
            case 8: monthName = "August"; break;
            case 9: monthName = "September"; break;
            case 10: monthName = "October"; break;
            case 11: monthName = "November"; break;
            case 12: monthName = "December";
        }
        return monthName;
    }

    // 提前声明方法签名
    static int getStartDay(int year, int month);

    static void printMonthBody(int year, int month) {
        int startDay = getStartDay(year, month);
        int numberOfDaysInMonth = getNumberOfDaysInMonth(year, month);
        
        int i = 0;
        for (i = 0; i < startDay; i++) {
            System.out.print("    ");
        }
        for (i = 1; i <= numberOfDaysInMonth; i++) {
            System.out.printf("%4d", i);
            if ((i + startDay) % 7 == 0) {
                System.out.println();
            }
        }
        System.out.println();
    }

    static int getStartDay(int year, int month) {
        int startDay1800 = 3;
        int totalNumberOfDays = getTotalNumberOfDays(year, month);
        return (totalNumberOfDays + startDay1800) % 7;
    }

    static int getTotalNumberOfDays(int year, int month) {
        int total = 0;
        for (int i = 1800; i < year; i++) {
            total += isLeapYear(i) ? 366 : 365;
        }
        for (int i = 1; i < month; i++) {
            total += getNumberOfDaysInMonth(year, i);
        }
        return total;
    }

    static int getNumberOfDaysInMonth(int year, int month) {
        if (month == 1 || month == 3 || month == 5 || month == 7 || 
            month == 8 || month == 10 || month == 12) {
            return 31;
        } else if (month == 4 || month == 6 || month == 9 || month == 11) {
            return 30;
        } else if (month == 2) {
            return isLeapYear(year) ? 29 : 28;
        }
        return 0;
    }

    static boolean isLeapYear(int year) {
        return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
    }
}

运行修正后的代码,日期会整齐对齐,同时方法找不到的错误也会解决。

内容的提问来源于stack exchange,提问作者Nicole

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 17:22:07