使用Calendar制作动态日历
创建一个类MyCalendar(Calendar抽象类)
该抽象类可以直接获取本机的日历实例,并通过YEAR,MONTH,DAY_OF_MONTH等方法操控该日历字段
创建构造器
定义属性年月,并创建构造器,,下面是代码:
private int year;
private int month;
private MyCalendar(int year,int month) {
this.year = year;
this.month = month;
}
获取实例
使用getinstance获取实例,并对日历属性初始化化。下面是代码:
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month-1);
c.set(Calendar.DAY_OF_MONTH, 1);
因为在Calendar.MONTH是从0~11,所以我们实际输入的值会比我们程序的月份值+1个月,所以我们在这里先事先-1处理。这样程序月份会和我们输入的月份统一。
日历每个月的格式处理
定义一个变量获取每个月第一天是这个星期的第几天,由此可获得每个月一号前可空几天。
再定一个变量获取当前月份的最大天数,下面是代码: c.get(Calendar.DAY_OF_WEEK) - 1处同Calendar理
int weekDay = c.get(Calendar.DAY_OF_WEEK) - 1;
int days = c.getActualMaximum(Calendar.DAY_OF_MONTH);
定义一个变量用来控制换行,但是先使用该变量控制输出1日前的空天数,使用for循环,使变量i小于之前的定义的weekDay,得出空格数,同时count自加,然后每当count = 7时换行。一直循环到这个月最大的天数。
int count = 0;
for (int i = 1; i < weekDay; i++) {
System.out.print("\t");
count++;
}
for (int i = 1; i <= days; i++) {
if (count == 7) {
System.out.println();
count = 0;
}
System.out.print(i+"\t");
count++;
}
测试
调用主函数,输入要查询的年月
public static void main(String[] args) {
new MyCalendar(2020, 7).showCaldendar();
}
bug修复
测试时发现每个月的第一天为当周的第0天时,出现bug,因为DAY_OF_WEEK是从周日到周六计算的,对应的索引为0~6,所以当weekDay=0时,直接将其重新赋值weekDay=7。
在for循环前加入下面代码:
if (weekDay == 0) {
weekDay = 7;
}