题目描述
已知2007年1月1日为星期一。
设计一函数按照下述格式打印2007年以后(含)某年某月的日历,2007年以前的拒绝打印。
为完成此函数,设计必要的辅助函数可能也是必要的。其中输入为年分和月份。
注意:短线“-”个数要与题目中一致,否则系统会判为错误。
输入
年月和月份
输出
无
样例输入
2010 9
样例输出
--------------------- Su Mo Tu We Th Fr Sa --------------------- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ---------------------
package parctice;
//提交前要把导包写入
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Scanner;
public class ph1493 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int year = sc.nextInt();
if (year < 2007)
return;
int month = sc.nextInt();
System.out.println("---------------------");
System.out.println(" Su Mo Tu We Th Fr Sa");
System.out.println("---------------------");
int i;
GregorianCalendar cal = new GregorianCalendar(year, month - 1, 1);// 对年份,月份,以及第一天来创建对象
int totalDays = cal.getActualMaximum(Calendar.DAY_OF_MONTH);// 获取该月份的天数
int startDay = cal.get(Calendar.DAY_OF_WEEK) - 1;// 获取该月的第一天是星期几
for (i = 0; i < startDay; i++)
System.out.print(" ");// 输出第一天前的空格
for (int day = 1; day <= totalDays; day++) {
if (day <= 9) { // 用于输出控制
System.out.print(" " + day);// 依次输出每一天
} else {
System.out.print(" " + day);
}
i++;
if (day < totalDays) {
if (i == 7) { // 每个星期输完换行
System.out.println();
i = 0;
}
} else {
System.out.println();
}
}
System.out.println("---------------------");
}
}
知识补充
GregorianCalendar类
Calendar类实现了公历日历,GregorianCalendar是Calendar类的一个具体实现。
Calendar 的getInstance()方法返回一个默认用当前的语言环境和时区初始化的GregorianCalendar对象。GregorianCalendar定义了两个字段:AD和BC。这是代表公历定义的两个时代。
下面列出GregorianCalendar对象的几个构造方法:
序号 | 构造函数和说明 |
1 | GregorianCalendar() 在具有默认语言环境的默认时区内使用当前时间构造一个默认的 GregorianCalendar。 |
2 | GregorianCalendar(int year, int month, int date) 在具有默认语言环境的默认时区内构造一个带有给定日期设置的 GregorianCalendar |
3 | GregorianCalendar(int year, int month, int date, int hour, int minute) 为具有默认语言环境的默认时区构造一个具有给定日期和时间设置的 GregorianCalendar。 |
4 | GregorianCalendar(int year, int month, int date, int hour, int minute, int second) 为具有默认语言环境的默认时区构造一个具有给定日期和时间设置的 GregorianCalendar。 |
5 | GregorianCalendar(Locale aLocale) 在具有给定语言环境的默认时区内构造一个基于当前时间的 GregorianCalendar。 |
6 | GregorianCalendar(TimeZone zone) 在具有默认语言环境的给定时区内构造一个基于当前时间的 GregorianCalendar。 |
7 | GregorianCalendar(TimeZone zone, Locale aLocale) 在具有给定语言环境的给定时区内构造一个基于当前时间的 GregorianCalendar。 |
int getActualMaximum(int field) 返回当前日期,给定字段的最大值 |
getActualMaximum(Calendar.DAY_OF_MONTH);返回一个月的天数
get(Calendar.DAY_OF_WEEK);返回的是一个月的第一天