package com.xxm.TaskA_Calendar;
import java.util.Calendar;
import java.io.*;
import java.util.ArrayList;
public class A_Calendar {
public static void main(String[] args) throws IOException {
//1.打印日历标题
PrintCalendar.printTitle();
//死循环,录入天数
lo:
while (true) {
//2.录入数据,判断年份是否为闰年
//录入
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.println();
System.out.print("请输入年份:");
int year = Integer.parseInt(reader.readLine());
if (year == -1) {
System.out.println("程序退出,谢谢使用");
break;
}
//创建 cal 对象,并将其年份设为输入值
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, year);
//判断闰年
boolean leapYearOrNot;
if (year % 400 == 0) {
leapYearOrNot = true;
} else if (year % 100 == 0) {
leapYearOrNot = false;
} else if (year % 4 == 0) {
leapYearOrNot = true;
} else {
leapYearOrNot = false;
}
//3.打印提示语,录入数据,判断该月份有多少天
//提示语
System.out.print("请输入月份:");
int month = 0;
int days = 0;
month = Integer.parseInt(reader.readLine());
if (month == -1) {
System.out.println("程序退出,谢谢使用");
break;
}//判断录入数据,不合理则报错并要求重新输入
else if (month > 12 || month < 1) {
System.out.println("输入错误,请输入正确的月份");
continue;
} else if (month == 2 && leapYearOrNot) {
days = 29;
} else if (month == 2) {
days = 28;
} else if (((month == 1 || month == 3) || ((month == 5) || (month == 7)) || ((month == 8 || month == 10) || month == 12))) {
days = 31;
} else {
days = 30;
}
//设置 cal 对象的月份为输2入月份 ,注意 Canlendar 对象中月份是从零开始的
cal.set(Calendar.MONTH, month - 1);
//4.判断该月份的一天是星期几。注意:dayOfWeek = 1 表示周日,dayOfWeek = 2 表示周一,以此类推。
cal.setFirstDayOfWeek(Calendar.MONDAY);
int dayOfWeek;
dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
//5.打印日历
PrintCalendar printCal = new PrintCalendar();
//将数据存入本月日期数临时数组中
ArrayList dateList = new ArrayList<>(days);
for (int i = 0; i < days; i++) {
dateList.add(i + 1);
}
//打印日历的星期数抬头
printCal.printDayOfWeekTitle();
//打印日期
printCal.printDate(dateList, dayOfWeek);
}
}
//打印日历类
static class PrintCalendar {
//打印日历标题的方法
public static void printTitle() {
//第一排:* 号
for (int i = 0; i < 53; i++) {
System.out.print('*');
}
System.out.println('*');
//第二排,* 号 + 空格
System.out.print('*');
for (int i = 0; i < 52; i++) {
System.out.print(' ');
}
System.out.println('*');
//第三排:* 号 + 标题
System.out.print('*');
for (int i = 0; i < 23; i++) {
System.out.print(' ');
}
System.out.print("CSDN万年历");
for (int i = 0; i < 20; i++) {
System.out.print(' ');
}
System.out.println('*');
//第四排,* 号 + 空格
System.out.print('*');
for (int i = 0; i < 52; i++) {
System.out.print(' ');
}
System.out.println('*');
//第五排:* 号
for (int i = 0; i < 54; i++) {
System.out.print('*');
}
System.out.println();
System.out.println();
}
//打印空格间距方法
private void printBlankSpace() {
System.out.print(" ");
}
//打印星期数的抬头
public void printDayOfWeekTitle() {
printBlankSpace();
System.out.print("一");
printBlankSpace();
System.out.print("二");
printBlankSpace();
System.out.print("三");
printBlankSpace();
System.out.print("四");
printBlankSpace();
System.out.print("五");
printBlankSpace();
System.out.print("六");
printBlankSpace();
System.out.print("日");
printBlankSpace();
System.out.println();
}
void printDate(ArrayList dateList, int dayOfWeek) {
//先将 7123456 版本的星期计数切换到中国人习惯的计数
int oneToSevenVersionDayOfWeek;
if (dayOfWeek == 1) {
oneToSevenVersionDayOfWeek = 7;
} else {
oneToSevenVersionDayOfWeek = dayOfWeek - 1;
}
//在传入数组前面插入相应数目(oneToSevenVersionDayOfWeek - 1)个0
for (int i = 0; i < oneToSevenVersionDayOfWeek - 1; i++) {
dateList.add(0, 0);
}
//新建一个字符串类型的辅助数组,用于打印,同时如果日期是个位数,则在后面加一个空格
ArrayList dateStrings = new ArrayList<>(dateList.size() + oneToSevenVersionDayOfWeek - 1);
for (int i = 0; i < dateList.size(); i++) {
if (dateList.get(i) == 0) {
dateStrings.add(" ");
} else if (dateList.get(i) < 10) {
dateStrings.add(Integer.toString(dateList.get(i)) + " ");
} else {
dateStrings.add(Integer.toString(dateList.get(i)));
}
}
//遍历打印,如果为周六打印红色字体,如果是周日,则打印红色字体,且打印完数字后面的附属空格后换行。
for (int i = 0; i < dateList.size(); i++) {
if ((i + 1) % 7 == 1) {
printBlankSpace();
System.out.print(dateStrings.get(i));
printBlankSpace();
}
//判断周六,是则输出红色
else if ((i + 1) % 7 == 6) {
System.out.print(" 33[31;m" + dateStrings.get(i) + " 33[0m");
printBlankSpace();
}
//判断周日,是周日则输出红色,且输出空格后换行
else if ((i + 1) % 7 == 0) {
System.out.print(" 33[31;m" + dateStrings.get(i) + " 33[0m");
printBlankSpace();
System.out.println();
} else {
System.out.print(dateStrings.get(i));
printBlankSpace();
}
}
}
}
}
实现效果如图:



