实现了输出本月的日历,结果如:
摘自《java核心技术 卷1》中的代码,觉得源码还是有点啰嗦,也可能是我的菜鸟级别欣赏不了大师的水平,后面自己要再试着写一遍
package impl.cal;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.text.DateFormatSymbols;
public class CalendarTest {
public static void main(String arge[]){
GregorianCalendar d=new GregorianCalendar();
int today=d.get(Calendar.DAY_OF_MONTH);//得到今天是这个月的第几天
int month=d.get(Calendar.MONTH);//得到当前是第几个月
d.set(Calendar.DAY_OF_MONTH, 1);//将日期改为本月的第一天
int weekday=d.get(Calendar.DAY_OF_WEEK);//得到本月的第一天为星期几
int firstDayOfWeek=d.getFirstDayOfWeek();//得到当前时区,一个星期的第一天设置为周几?(有的是周日,有的是周一)
//System.out.println(firstDayOfWeek); //输出1 就是星期日啦
int intent=0;
while(weekday!=firstDayOfWeek){
intent++;
d.add(Calendar.DAY_OF_MONTH, -1);//日期后退一天,进入上个月
weekday=d.get(Calendar.DAY_OF_WEEK);//得到后退一天是星期几,直到weekday取值为星期日,d设置为一个星期的第一天,但不是在本月
}
String[] weekdayNames=new DateFormatSymbols().getShortWeekdays();
/*for(String a:weekdayNames){
System.out.print(a+"\t");
}*/
do{
System.out.printf("%4s",weekdayNames[weekday]);
d.add(Calendar.DAY_OF_MONTH, 1);//日期向前一天
weekday=d.get(Calendar.DAY_OF_WEEK);
}while(weekday!=firstDayOfWeek); //其实就是输出了列名
System.out.println();
//输出要缩进的格数
for(int i=1;i<=intent;i++){
System.out.print(" ");
}
d.set(Calendar.DAY_OF_MONTH, 1);
do{
int day=d.get(Calendar.DAY_OF_MONTH);
System.out.printf("%5d",day);
//检测如果是今天,就多输出一个字符
if(day==today) System.out.print("$");
else System.out.print(" ");
d.add(Calendar.DAY_OF_MONTH, 1);
weekday=d.get(Calendar.DAY_OF_WEEK);
if(weekday==firstDayOfWeek) System.out.println();
}while(d.get(Calendar.MONTH)==month);
if(weekday!=firstDayOfWeek) System.out.println();//如果本月的最后一天是周一到周六内的,就输出一个换行,循环里没输出
}
}