今天练习了一个输出日历的项目,学会了localDate类的用法,熟悉了一下类和对象的相关知识.
package day05;
import java.time.LocalDate;
import java.util.Scanner;
/***
* 输出日历
* 输入年份和月份 输出日历 给今天加特殊标记*
*/
public class Demo3 {
public static void main(String[] args) {
getCal();
}
public static void getCal() {
LocalDate localDate = LocalDate.now(); //调用localDate类
int nowDay = localDate.getDayOfMonth(); //今天的日,月,年
int nowMonth = localDate.getMonthValue();
int nowYear = localDate.getYear();
Scanner n = new Scanner(System.in);
while (true) {
System.out.println();
System.out.println("请输入要查询的年份:");
int y = n.nextInt();
System.out.println("请输入要查询的月份:");
int m = n.nextInt();
// LocalDate start = localDate.minusDays(nowDay-1);
LocalDate start = LocalDate.of(y, m, 1); //调用localDate类 将这年这月的第一天的localDate对象赋给start
int day = start.getDayOfMonth(); //分别从localDate对象中抽取出日,月,年
int month = start.getMonthValue();
int year = start.getYear();
// int week = start.getDayOfWeek().getValue();
int startWeek = start.getDayOfWeek().getValue(); //取出周
int hang = 1; //输出的行数
System.out.println(" 一\t二\t三\t四\t五\t六\t日");
a:
while (true) {
for (int i = 1; i <= 7; i++) { //列数
if (i < startWeek && hang == 1) { //如果是第一行,且列数小于本月第一天的周数 输出空
System.out.print("\t");
continue;
}
if (nowYear == year && nowMonth == month && nowDay == day) { //如果循环到和今天相同的日期,加*
if (day < 10) {
System.out.print(day + "*\t");
} else {
System.out.print(day + "*\t");
}
} else { //否则不加
if (day < 10) {
System.out.print(day + "\t");
} else {
System.out.print(day + "\t");
}
}
day++;
if (day > start.lengthOfMonth()) break a; //如果日期超过了当前月的最大天数,跳出循环
if (i % 7 == 0) System.out.println(); //每7列换一行
}
hang++;
}
}
}
}
期间遇到了输出格式对齐的问题.用空格凑了好久才凑齐,后来才发现用\t就行了.\t就是专门用来对齐的.以后可以多用.或者还可以使用printf,用%号分配位置.
今天课程讲到了递归.网上查了一下递归的优缺点,发现递归除了比较容易写之外,没什么优点.说容易写其实也不准确,因为我觉得递归比循环难理解一些.只是遍历二叉树的时候用起来比较方便.平常能不用就不用吧.