选用教材:《Java核心技术卷一》
第四章 对象与类
一、书上代码示例:输出当月日期。
第一种写法:
public class CalendarTest { public static void main(String[] args) { LocalDate date=LocalDate.now();//得到一个表示当前日期的对象 int month=date.getMonthValue();//得到当前日期的年 int today=date.getDayOfMonth();//得到当前日期的日 date=date.minusDays(today-1);//生成当前日期之前16天的日期 DayOfWeek weekday=date.getDayOfWeek();//得到当前日期是星期几,作为DayOfWeek的一个实例返回 int value=weekday.getValue();//调用getValue方法来得到1-7之间的一个数,表示这是星期几 //1表示星期一,7表示星期日。 System.out.println("Mon Tue Wed Thu Fri Sat Sun"); System.out.print(" ");//第一行缩进 for(int i=1;i<value;i++) { while(date.getMonthValue()==month) { System.out.printf("%3d",date.getDayOfMonth()); if(date.getDayOfMonth()==today) System.out.print("*");//当前日期后加一个*标志 else System.out.print(" "); date=date.plusDays(1);//生成当前日期之后1天的日期 if(date.getDayOfWeek().getValue()==1)//达到一周的星期一就换行 System.out.println(); } if(date.getDayOfWeek().getValue()!=1) System.out.println(); } } }
第二种写法:
public class CalendarTest { public static void main(String[] args) { LocalDate date=LocalDate.now();//得到一个表示当前日期的对象 int month=date.getMonthValue();//得到当前日期的年 int today=date.getDayOfMonth();//得到当前日期的日 date=date.minusDays(today-1);//生成当前日期之前16天的日期 DayOfWeek weekday=date.getDayOfWeek();//得到当前日期是星期几,作为DayOfWeek的一个实例返回 int value=weekday.getValue();//调用getValue方法来得到1-7之间的一个数,表示这是星期几 //1表示星期一,7表示星期日。 System.out.println("Mon Tue Wed Thu Fri Sat Sun"); for(int i=1;i<value;i++) System.out.print(" ");//第一行缩进 while(date.getMonthValue()==month) { System.out.printf("%3d",date.getDayOfMonth()); if(date.getDayOfMonth()==today) System.out.print("*");//当前日期后加一个*标志 else System.out.print(" "); date=date.plusDays(1);//生成当前日期之后1天的日期 if(date.getDayOfWeek().getValue()==1)//达到一周的星期一就换行 System.out.println(); } if(date.getDayOfWeek().getValue()!=1) System.out.println(); } }
二、比较难理解的地方:
1、类DayOfWeek的实例化:
DayOfWeek weekday=date.getDayOfWeek();
得到当前日期是周几,再以一个实例返回。
2、getValue()方法的错误理解:
并不是初始值为7,而是当天(2020.3.7)本来就是周日。
3、首行缩进:
System.out.println("Mon Tue Wed Thu Fri Sat Sun"); System.out.print(" ");//第一行缩进
可以放在后面的for循环里,也可以放在这个位置。缩进多少取决于当天是周几。个人认为第一种写法更方便理解。
4、诡异的换行符:
date=date.plusDays(1);//生成当前日期之后1天的日期 if(date.getDayOfWeek().getValue()==1)//达到一周的星期一就换行 System.out.println();
这里是判断当前日期是否是下一周的周一,若是,则换到新的一周。开始没注意到输出Day的语句在上面,所以理解成了到了下一周的周日才换行。
5、循环之外的输出语句:
if(date.getDayOfWeek().getValue()!=1) System.out.println();
我的理解是:这一个判断条件加一个输出语句,是为了确保最后date对应的天数超过了本月,从而不让程序继续输出第二个月的日历。