【0】README
0.1)本文文字总结于 core java volume 1 , 源代码均为原创;
0.2)本文旨在熟悉 GregorianCalendar 日历类,每一天就是一个GregorianCalendar 日历类,一天有很多的日历属性,觉得用它打印一个月份的日历出来很好玩的样子;
【1】直接对源代码的关键步骤进行分析:
- step1) 首先构造一个日历对象,并用当前的日期和时间进行初始化(这里还设置了日历类的时区和方言):
gc = new GregorianCalendar(TimeZone.getTimeZone("Asia/Chongqing"),Locale.SIMPLIFIED_CHINESE);
- step2) 调用get方法获得当前的日月
today = gc.get(Calendar.DAY_OF_MONTH);
month = gc.get(Calendar.MONTH); //当前月份
- step3) 将 gc 设置为当前月的第一天,得到这个月的第一天是星期几以及一周的第一天:
gc.set(Calendar.DAY_OF_MONTH, 1); //设置 gc 为当前月的第一天
weekday = gc.get(Calendar.DAY_OF_WEEK);//这个月的第一天是星期几
firstDayOfWeek = gc.getFirstDayOfWeek(); // 一周的第一天,美国是周日,中国是周一
- 如果第一天是星期日,变量firstDayOfWeek就是Calendar.SUNDAY , 如果是星期一,就设置为Calendar.MONDAY, 以此类推;(在美国,每个星期的第一天是星期日, 而欧洲是星期一)
- Hint)如果想看到不同地区程序的输出, 应该在main 方法的第一行中添加如下代码(如ITALY):
Locale.setDefault(Locale.ITALY);
- step4)获得星期名数组+打印星期
weekdayNames = new DateFormatSymbols().getShortWeekdays();//星期名数组
for(String str : weekdayNames) //打印星期名称数组out.printf("%6s", str);
out.printf("\n");
- step5)打印前面的缩进空格(空格数==这个月第一天的星期数减去该地区星期的起始计数(美国是星期日,中国是星期一))
for (int i = 0; i < weekday - firstDayOfWeek; i++)out.printf("%5s", " "); //打印前面的缩进空格
- step6)正式开始打印日历(只需要注意,当循环到的日历天 属于 该地区星期的起始计数时(美国是星期日,中国是星期一),要换行打印,以及如果日历循环到今天,则多打印一个*号以示区别)
for (int i = 1; i <= 100; i++)
{gc.set(Calendar.DAY_OF_MONTH, i);if(gc.get(Calendar.MONTH) != month)break;if(gc.get(Calendar.DAY_OF_WEEK) == firstDayOfWeek)out.printf("\n");out.printf("%5d", i);if(i == today)out.printf("*");
}
【2】源代码
2.1)download source code: https://github.com/pacosonTang/core-java-volume/blob/master/chapter4/Chapter4Test.java 中的 main1 方法;
2.2)source code at a glance:
public static void main1(String[] args){GregorianCalendar gc;int today;int month;int weekday;int firstDayOfWeek;String[] weekdayNames; Locale.setDefault(Locale.CHINESE);// 设置方言为 简体中文;gc = new GregorianCalendar(TimeZone.getTimeZone("Asia/Chongqing"),Locale.SIMPLIFIED_CHINESE);// 上行设置日历的时区和方言today = gc.get(Calendar.DAY_OF_MONTH);gc.set(Calendar.DAY_OF_MONTH, 1); //设置 gc 为当前月的第一天weekday = gc.get(Calendar.DAY_OF_WEEK);//这个月的第一天是星期几firstDayOfWeek = gc.getFirstDayOfWeek(); // 一周的第一天,美国是周日,中国是周一month = gc.get(Calendar.MONTH); //当前月份weekdayNames = new DateFormatSymbols().getShortWeekdays();//星期名数组//System.out.println(today + " " + month + " " + weekday + " " + firstDayOfWeek);for(String str : weekdayNames) //打印星期名称数组out.printf("%6s", str);out.printf("\n");for (int i = 0; i < weekday - firstDayOfWeek; i++)out.printf("%5s", " "); //打印前面的缩进空格for (int i = 1; i <= 100; i++){gc.set(Calendar.DAY_OF_MONTH, i);if(gc.get(Calendar.MONTH) != month)break;if(gc.get(Calendar.DAY_OF_WEEK) == firstDayOfWeek)out.printf("\n");out.printf("%5d", i);if(i == today)out.printf("*");}}