在前面解决了诸多涉及到知识点,现在终于可以开始正式讲解万年历了:
首先上图看一下最终效果:
思路:1:首先我们能想到的就是平年闰年的判断,一个返回boolean值的方法,所以我们需要单独先写一个方法:leapYearOrNot
public static boolean leapYearOrNot(int year) {
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
return true;
} else {
return false;
}
}
2:然后我们发现一开始有一个“万年历“这样的动画,按照自己喜欢的方式来实现就好:PrintTitle()
public static void PrintTitle() {
System.out.println("******************************************************");
System.out.println("* *");
System.out.println("* *");
System.out.println("* *");
System.out.println("* 万年历 *");
System.out.println("* *");
System.out.println("* *");
System.out.println("* *");
System.out.println("******************************************************");
}
3:然后首先为了保证我们可以不断地去输入年份月份去循环,先在主方法最外面写一个while:然后根据题目要求写输入年份语句:注意这里的while循环没有结束,大括号还在下面
while (true) {
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;
}
4:然后想,我们刚刚输入了日期接下来该干什么?是不是要让java知道这个日期,那么java怎样就可以知道这个日期呢?通过的就是我们前面说的Calendar:
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, year);
5:这样就是先初始化了日期然后set设置了年份为我们刚刚输入的,接下来,我们写输入月份的语句:
System.out.print("请输入月份:");
int mouth = 0;
int days = 0;
mouth = Integer.parseInt(reader.readLine());
6:然后我们在前面输入年之前判断了年的闰与平,现在应该判断月份的天数了:
if (mouth == -1) {
System.out.println("欢迎使用,已退出万年历程序,再见!");
break;
} else if (mouth >= 12 && mouth <= 9) {
System.out.println("您输入的月份不正确,请输入1-12的数字");
} else if (mouth == 2 && leapYearOrNot(year)) {
days = 29;
} else if (mouth == 2) {
days = 28;
} else if (mouth == 1 || mouth == 3 || mouth == 5 || mouth == 7 || mouth == 8 || mouth == 10 || mouth == 12) {
days = 31;
} else {
days = 30;
}
7:接下来同理,上面让java读懂了年份,现在让它读懂月份:
cal.set(Calendar.MONTH, mouth - 1);
8:现在就是月份和年都输入并且java录入了,我们想一下打印日历是不是需要知道每个月的第一天?现在就需要用到Calendar的一个方法:
cal.setFirstDayOfWeek(Calendar.MONDAY);
int dayofweek;
dayofweek = cal.get(Calendar.DAY_OF_WEEK);
8.5:一个大的日期打印类:PrintCalendar
:
static class PrintCalendar {
9:接下来的方法就都是与打印相关的了,首先我们会经常用到空格,那么就写一个空格方法:printBlankSpace()
10:看图得知第一行是打印周一到周日:printDayOfWeekTitle
public static 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();
}
11:我们可以看到这个日历2021年2月份,在周六之前是没有日期的,所以我们需要判断一下需要一开始打印多少空格,还有星期转化:然后这些小方法应该包含在大方法打印输出类里面:printData
:
11.1:先转换为中国日期:
public static void printData (ArrayList < Integer > datalist,int dayofWeek){
int ChinadayofWeek;
if (dayofWeek == 1) {
ChinadayofWeek = 7;
} else {
ChinadayofWeek = dayofWeek - 1;
}
11.2:打印多余的空格:
for (int i = 0; i < ChinadayofWeek - 1; i++) {
datalist.add(0, 0);
}
11.3:首先说一下现在到哪一步了,图例:
11.4:用辅助数组去存放需要打印的数据:
ArrayList<String> dataStrings = new ArrayList<>(datalist.size() + ChinadayofWeek - 1);
for (int i = 0; i < datalist.size(); i++) {
if (datalist.get(i) == 0) {
dataStrings.add(" ");
} else if (datalist.get(i) < 10) {
dataStrings.add(Integer.toString(datalist.get(i)) + " ");
} else {
dataStrings.add(Integer.toString(datalist.get(i)));
}
}
11.5:开始遍历打印:
for (int i = 0; i < datalist.size(); i++) {
if ((i + 1) % 7 == 1) {
printBlankSpace();
System.out.print(dataStrings.get(i));
printBlankSpace();
} else if ((i + 1) % 7 == 6) {
System.out.print("\033[33;4m" + dataStrings.get(i) + "\033[0m");
printBlankSpace();
} else if ((i + 1) % 7 == 0) {
System.out.print("\033[33;4m" + dataStrings.get(i) + "\033[0m");
printBlankSpace();
System.out.println();
} else {
System.out.print(dataStrings.get(i));
printBlankSpace();
}
}
12:回到主方法最后开始输出:
PrintCalendar printCalendar = new PrintCalendar();
ArrayList<Integer> dataList = new ArrayList<>(days);
for (int i = 0; i < days; i++) {
dataList.add(i + 1);
}
printCalendar.printDayOfWeekTitle();
printCalendar.printData(dataList,dayofweek);
全部代码:
package 任务A;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Calendar;
public class CalendarTest {
public static boolean leapYearOrNot(int year) {
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
return true;
} else {
return false;
}
}
public static void main(String[] args) throws IOException {
PrintCalendar.PrintTitle();
while (true) {
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;
}
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, year);
System.out.print("请输入月份:");
int mouth = 0;
int days = 0;
mouth = Integer.parseInt(reader.readLine());
if (mouth == -1) {
System.out.println("欢迎使用,已退出万年历程序,再见!");
break;
} else if (mouth >= 12 && mouth <= 9) {
System.out.println("您输入的月份不正确,请输入1-12的数字");
} else if (mouth == 2 && leapYearOrNot(year)) {
days = 29;
} else if (mouth == 2) {
days = 28;
} else if (mouth == 1 || mouth == 3 || mouth == 5 || mouth == 7 || mouth == 8 || mouth == 10 || mouth == 12) {
days = 31;
} else {
days = 30;
}
cal.set(Calendar.MONTH, mouth - 1);
cal.setFirstDayOfWeek(Calendar.MONDAY);
int dayofweek;
dayofweek = cal.get(Calendar.DAY_OF_WEEK);
PrintCalendar printCalendar = new PrintCalendar();
ArrayList<Integer> dataList = new ArrayList<>(days);
for (int i = 0; i < days; i++) {
dataList.add(i + 1);
}
printCalendar.printDayOfWeekTitle();
printCalendar.printData(dataList,dayofweek);
}
}
static class PrintCalendar {
public static void PrintTitle() {
System.out.println("******************************************************");
System.out.println("* *");
System.out.println("* *");
System.out.println("* *");
System.out.println("* 万年历 *");
System.out.println("* *");
System.out.println("* *");
System.out.println("* *");
System.out.println("******************************************************");
}
public static void printBlankSpace () {
System.out.print(" ");
}
public static 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();
}
public static void printData (ArrayList < Integer > datalist,int dayofWeek){
int ChinadayofWeek;
if (dayofWeek == 1) {
ChinadayofWeek = 7;
} else {
ChinadayofWeek = dayofWeek - 1;
}
for (int i = 0; i < ChinadayofWeek - 1; i++) {
datalist.add(0, 0);
}
ArrayList<String> dataStrings = new ArrayList<>(datalist.size() + ChinadayofWeek - 1);
for (int i = 0; i < datalist.size(); i++) {
if (datalist.get(i) == 0) {
dataStrings.add(" ");
} else if (datalist.get(i) < 10) {
dataStrings.add(Integer.toString(datalist.get(i)) + " ");
} else {
dataStrings.add(Integer.toString(datalist.get(i)));
}
}
for (int i = 0; i < datalist.size(); i++) {
if ((i + 1) % 7 == 1) {
printBlankSpace();
System.out.print(dataStrings.get(i));
printBlankSpace();
} else if ((i + 1) % 7 == 6) {
System.out.print("\033[33;4m" + dataStrings.get(i) + "\033[0m");
printBlankSpace();
} else if ((i + 1) % 7 == 0) {
System.out.print("\033[33;4m" + dataStrings.get(i) + "\033[0m");
printBlankSpace();
System.out.println();
} else {
System.out.print(dataStrings.get(i));
printBlankSpace();
}
}
}
}
}
图片: