Java编写程序,输入年份,打印出该年的年历(12 个月的),如下图所示。 提示:先求出输入年份的 1 月 1 日是星期几,然后通过循环打印出每个月的日历, 注意大小月和闰月问题
时间: 2023-06-14 13:05:36 浏览: 193
JAVA打印一年的日历
4星 · 用户满意度95%
以下是Java代码实现,注释中有详细的解释:
```java
import java.util.Scanner;
public class YearCalendar {
public static void main(String[] args) {
// 获取输入的年份
Scanner scanner = new Scanner(System.in);
System.out.print("请输入年份:");
int year = scanner.nextInt();
// 计算该年份的1月1日是星期几
int weekDay = getWeekDay(year, 1, 1);
// 打印出整个年份的日历
for (int month = 1; month <= 12; month++) {
System.out.println(getMonthCalendar(year, month, weekDay));
// 计算下一个月1号是星期几
weekDay = (weekDay + getMonthDays(year, month)) % 7;
}
}
/**
* 获取某年某月的日历
*
* @param year 年份
* @param month 月份
* @param weekDay 该月1号是星期几
* @return 该月的日历字符串
*/
private static String getMonthCalendar(int year, int month, int weekDay) {
StringBuilder sb = new StringBuilder();
// 打印月份和星期几
sb.append(year).append("年").append(month).append("月\n");
sb.append("日\t一\t二\t三\t四\t五\t六\n");
// 计算该月的天数
int days = getMonthDays(year, month);
// 打印日历表格
for (int i = 1; i <= days; i++) {
if (i == 1) {
// 第一天前面需要打印出该月1号是星期几之前的空格
for (int j = 0; j < weekDay; j++) {
sb.append("\t");
}
}
sb.append(i).append("\t");
if ((weekDay + i) % 7 == 0) {
// 每周的最后一天需要换行
sb.append("\n");
}
}
// 如果该月最后一天不是周六,需要补齐下一个月1号之前的空格
if ((weekDay + days) % 7 != 6) {
sb.append("\n");
}
return sb.toString();
}
/**
* 获取某年某月的天数
*
* @param year 年份
* @param month 月份
* @return 该月的天数
*/
private static int getMonthDays(int year, int month) {
if (month == 2) {
// 闰年2月有29天
return isLeapYear(year) ? 29 : 28;
} else if (month == 4 || month == 6 || month == 9 || month == 11) {
// 小月有30天
return 30;
} else {
// 大月有31天
return 31;
}
}
/**
* 判断某年是否为闰年
*
* @param year 年份
* @return 是否为闰年
*/
private static boolean isLeapYear(int year) {
return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}
/**
* 计算某年某月某日是星期几
*
* @param year 年份
* @param month 月份
* @param day 日
* @return 星期几(0表示星期日,1表示星期一,以此类推)
*/
private static int getWeekDay(int year, int month, int day) {
if (month < 3) {
// 如果是1月或2月,按上一年的13月和14月来计算
month += 12;
year--;
}
int c = year / 100;
int y = year % 100;
int weekDay = (c / 4 - 2 * c + y + y / 4 + 13 * (month + 1) / 5 + day - 1) % 7;
if (weekDay < 0) {
// Java的%运算符是取余而不是取模,需要特判负数
weekDay += 7;
}
return weekDay;
}
}
```
运行程序,输入年份后,即可输出该年的日历。
阅读全文