Java实现万年历
以下是一段Java代码,可以实现一个简单的万年历。该程序可以根据用户输入的年份和月份,显示该月的日历。
import java.util.Scanner;
public class Calendar {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 提示用户输入年份和月份
System.out.print("请输入年份:");
int year = scanner.nextInt();
System.out.print("请输入月份:");
int month = scanner.nextInt();
// 调用方法打印日历
printCalendar(year, month);
}
// 打印日历的方法
public static void printCalendar(int year, int month) {
// 打印标题
System.out.println(" " + getMonthName(month) + " " + year);
System.out.println("日 一 二 三 四 五 六");
// 获取该月的第一天是星期几
int startDay = getStartDay(year, month);
// 获取该月的总天数
int numberOfDaysInMonth = getNumberOfDaysInMonth(year, month);
// 打印空格,使第一天对应的日期正确对齐
for (int i = 0; i < startDay; i++) {
System.out.print(" ");
}
// 打印日期
for (int i = 1; i <= numberOfDaysInMonth; i++) {
System.out.printf("%2d ", i);
// 换行
if ((i + startDay) % 7 == 0) {
System.out.println();
}
}
}
// 获取月份的名称
public static String getMonthName(int month) {
String monthName = "";
switch (month) {
case 1:
monthName = "一月";
break;
case 2:
monthName = "二月";
break;
case 3:
monthName = "三月";
break;
case 4:
monthName = "四月";
break;
case 5:
monthName = "五月";
break;
case 6:
monthName = "六月";
break;
case 7:
monthName = "七月";
break;
case 8:
monthName = "八月";
break;
case 9:
monthName = "九月";
break;
case 10:
monthName = "十月";
break;
case 11:
monthName = "十一月";
break;
case 12:
monthName = "十二月";
break;
}
return monthName;
}
// 获取某年某月的第一天是星期几
public static int getStartDay(int year, int month) {
final int START_DAY_FOR_JAN_1_1800 = 3;
int totalNumberOfDays = getTotalNumberOfDays(year, month);
return (totalNumberOfDays + START_DAY_FOR_JAN_1_1800) % 7;
}
// 获取某年某月的总天数
public 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 {
return isLeapYear(year) ? 29 : 28;
}
}
// 判断某年是否是闰年
public static boolean isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
// 获取1800年1月1日到指定年份指定月份之间的总天数
public static int getTotalNumberOfDays(int year, int month) {
int total = 0;
for (int i = 1800; i < year; i++) {
if (isLeapYear(i)) {
total += 366;
} else {
total += 365;
}
}
for (int i = 1; i < month; i++){
total += getNumberOfDaysInMonth(year, i);
}
return total;
}
}
以上代码实现了一个简单的万年历程序。用户可以输入年份和月份,程序会根据输入的年份和月份打印出对应月份的日历。程序使用了一些辅助方法来计算星期几、月份的天数以及判断是否是闰年等。
首先,程序会提示用户输入年份和月份。然后,调用printCalendar
方法来打印日历。printCalendar
方法首先打印出月份和年份的标题,然后根据该月的第一天是星期几来确定第一天前面需要打印几个空格。接着,根据该月的总天数逐个打印日期,并在每周的末尾换行。
程序还提供了其他几个辅助方法。getMonthName
方法根据月份的数字返回对应的月份名称。getStartDay
方法根据输入的年份和月份,计算出该月的第一天是星期几。getNumberOfDaysInMonth
方法根据输入的年份和月份,返回该月的总天数。isLeapYear
方法判断某年是否是闰年。getTotalNumberOfDays
方法计算从1800年1月1日到指定年份指定月份之间的总天数。
希望以上代码和解释能够帮助你实现一个简单的万年历程序。如果有任何疑问,请随时提问。