要输出指定年份和月份的日历首先要获知指定月有几天,指定月有几个星期,还有指定月的第一天和最后一天是星期几。
需要注意的是:在Calendar类中,星期日到六分别用1~7表示,而月份是从0开始计的,即一月对应0。
/**
* 获取某月中的某天是星期几
*
* @return
*/
public static int weekDay(Calendar cal)
{
int weekday = cal.get(Calendar.DAY_OF_WEEK);
if (weekday == 1)// 西方星期日为第一天,星期一为第二天
weekday = 7;
else
weekday -= 1;
return weekday;
}
该日历主要分三部分显示:第一个星期,中间几个星期,最后一个星期。因为每个星期有7天,第一个星期和最后一个星期可能不会显示完,而中间的几个星期是可以将七天都显示完全的。
第一个星期要注意在1号之前的星期几显示空格,中间的几个星期日期依次累加即可,最后一个星期只显示到最后一天。
如果第一个星期是从星期天开始的,则将其归到中间的几个星期一起显示,否则单独处理。
如果最后一个星期在该月只有星期天一天,则只显示这天即可,否则日期累加显示到最后一天。
由于Calendar是抽象类,故实例化使用getInstance()方法,也可采用实例化子类GregorianCalendar
(该显示指定年月的日历类的类名为MyCalerdar)
public void calendar(int year, int month)
{
Calendar firstcal = Calendar.getInstance();
Calendar lastcal = Calendar.getInstance();
System.out.println("\t\t" + year + "年" + month + "月");
System.out.println("日\t一\t二\t三\t四\t五\t六");
firstcal.set(year, month - 1, 1);// 所求月的第一天
int dateofmonth = firstcal.getActualMaximum(Calendar.DATE);// 获取该月的天数
lastcal.set(year, month - 1, dateofmonth);// 所求月的最后一天
// 获取所求月第一天是星期几,输出是中文的而不是数字的
// SimpleDateFormat fm = new SimpleDateFormat("E");
// System.out.println(fm.format(firstcal.getTime()));
int weekofmonth = firstcal.getActualMaximum(Calendar.WEEK_OF_MONTH);// 获取该月的星期数
String[][] week = new String[weekofmonth][7];
int firstday = MyCalendar.weekDay(firstcal); // 获取所求月第一天是星期几
int lastday = MyCalendar.weekDay(lastcal); // 获取所求月最后一天是星期几
int m = 1, f = 1;// f的作用主要是判断是否需要将第一个星期归到中间几个星期一起计算
int j;
// 第一个星期
if (firstday == 7)
{
f = 0;
} else
{
for (j = 0; j < firstday; j++)
{
week[0][j] = " ";
System.out.print(week[0][j] + "\t");
}
for (j = firstday; j < 7; j++)
{
week[0][j] = m + "";
m++;
System.out.print(week[0][j] + "\t");
}
System.out.println();
}
// 中间的几个星期
for (int i = f; i < weekofmonth - 1; i++)
{
for (j = 0; j < 7; j++)
{
week[i][j] = m + "";
m++;
System.out.print(week[i][j] + "\t");
}
System.out.println();
}
// 最后一个星期
if (lastday == 7)
{
week[weekofmonth - 1][0] = m + "";
System.out.print(week[weekofmonth - 1][0] + "\t");
} else
{
for (j = 0; j <= lastday; j++)
{
week[weekofmonth - 1][j] = m + "";
m++;
System.out.print(week[weekofmonth - 1][j] + "\t");
}
}
}
主方法(类名为MyCalendar):
public static void main(String[] args)
{
MyCalendar mycal = new MyCalendar();
Scanner input = new Scanner(System.in);
System.out.println("<<<<<<<<<<<<<<万年历>>>>>>>>>>>>>>");
System.out.print("请输入年份:");
int year = input.nextInt();
System.out.print("请输入月份:");
int month = input.nextInt();
mycal.calendar(year, month);
}
输入:2015年9月
输出:
输入:2015年2月
输出: