三个需要注意的点:
- 三个类以及相关方法的使用:Date,DateFormat,Calendar,特别是Calendar这个类的get,set和getActualMaximum方法,非常常用
- 闰年的计算,从我们出生开始,只要跟日历有关的,就脱离不了闰年的计算
- 注意是否跨年,跨的是否为闰年
因为只是个用于练习日期相关类的demo,就没有进行MVC相关类方法的分割,也没有封装方法,就这么一股脑的写过去了。毕竟跟弄一个快递系统相比,这个demo以后真的没什么维护的必要。
唯一卡了我很久的难点就是对齐问题,老师真没教左对齐和右对齐的概念,还好我女神度娘啥都有让我搜出来了,这个demo完结撒花
import java.text.DateFormat;
import java.util.Calendar;
import java.util.Scanner;
public class CalendarForRest {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while (true) {
//输入年、月
System.out.println("请输入年:");
String inputYear = input.nextLine();
System.out.println("请输入月:");
String inputMonth = input.nextLine();
int year = Integer.parseInt(inputYear);
int month = Integer.parseInt(inputMonth) - 1;
//根据输入的年、月设定日历时间
java.util.Calendar clSearch = java.util.Calendar.getInstance();
clSearch.set(java.util.Calendar.YEAR, year);
clSearch.set(java.util.Calendar.MONTH, month);
clSearch.set(java.util.Calendar.DATE, 1);
//第一天放假的日期是2020年2月2日
java.util.Calendar clBase = java.util.Calendar.getInstance();
clBase.set(java.util.Calendar.YEAR, 2020);
clBase.set(java.util.Calendar.MONTH, 1);
clBase.set(java.util.Calendar.DATE, 2);
int maxDayOfMonth = clSearch.getActualMaximum(java.util.Calendar.DAY_OF_MONTH);
int firstDayOfWeek = clSearch.get(java.util.Calendar.DAY_OF_WEEK);
// 确定是星期几
int weekIndex = firstDayOfWeek - 1;
// 确定是当月日历的第几行
int monthRound = 0;
// 周末一共休息多少天
int weekendTotalRestDay = 0;
// 当月一共休息多少天
int monthTotalRestDay = 0;
// distanceCount要计算日历中的天数与2020年2月2日的距离天数,如果是2020年2月,则不做处理
int distanceCount = 0;
if (!(clSearch.get(java.util.Calendar.YEAR) == 2020 && clSearch.get(java.util.Calendar.MONTH) == 1)) {
int dayBase = clBase.get(java.util.Calendar.DAY_OF_YEAR);
int daySearch = clSearch.get(java.util.Calendar.DAY_OF_YEAR);
int yearBase = clBase.get(java.util.Calendar.YEAR);
int yearSearch = clSearch.get(java.util.Calendar.YEAR);
//不同一年
if (yearBase != yearSearch) {
int timeDistance = 0;
for (int i = yearBase; i < yearSearch; i++) {
if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {
timeDistance += 366;
} else {
timeDistance += 365;
}
}
distanceCount = timeDistance + (daySearch - dayBase + 1);
} else {
distanceCount = daySearch - dayBase + 1 ;
}
}
// 输出日历
printCalendar(maxDayOfMonth,monthRound,weekIndex,distanceCount,monthTotalRestDay,weekendTotalRestDay);
}
}
private static void printCalendar(int maxDayOfMonth,int monthRound,int weekIndex,int distanceCount,int monthTotalRestDay,int weekendTotalRestDay){
for (int i = 0; i < maxDayOfMonth; i++) {
//输出日历的主要逻辑
if (monthRound == 0) {
System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
System.out.println();
for (int j = weekIndex; j > 0; j--) {
System.out.print('\t');
System.out.print('\t');
}
}
if (distanceCount % 4 == 1) {
System.out.printf("%-8s","["+(i+1)+"]");
monthTotalRestDay += 1;
if (weekIndex == 0 || weekIndex == 6) {
weekendTotalRestDay += 1;
}
} else {
System.out.printf("%-8d",i+1);
}
weekIndex++;
monthRound++;
distanceCount++;
// 当遍历到周六时,换行
if (weekIndex >= 7) {
System.out.println();
weekIndex = 0;
}
}
System.out.println();
System.out.println("本月休息天数有:" + monthTotalRestDay + "天");
System.out.println("本月轮到周末休息的天数是:" + weekendTotalRestDay + "天");
System.out.println();
}
}