使用java.util.Calendar类实现一个简单的日历显示:
public class MyCalendar {
public static void main(String[] args) throws IOException {
Calendar c = Calendar.getInstance();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入年-月-日:");
String[] date = br.readLine().split("-");
// 设置年月日
try {
c.set(Calendar.YEAR, Integer.parseInt(date[0]));
// 月份要减去1
c.set(Calendar.MONTH, Integer.parseInt(date[1]) - 1);
c.set(Calendar.DATE, Integer.parseInt(date[2]));
}catch (NumberFormatException nfe){ // 用户的输入可能有问题
System.out.println("您的输入有误,系统将输出今天日期");
}
br.close();
int day = 1; // 日期从1号开始
int week = 1; // 每周从星期1开始;
// 获取这个月1号是星期几
int monthFirstWeek = getMonthOneWeek(c.get(Calendar.WEEK_OF_MONTH), c.get(Calendar.DAY_OF_WEEK), c.get(Calendar.DAY_OF_MONTH));
// 上个月最大的日期
int beforeMonthDay = getMonthMax(c.get(Calendar.YEAR), c.get(Calendar.MONTH));
// 第一周开始的日期 这个月1号要占用一个位置,开始的日期要占用一个位置,所以-2
int startWeek = beforeMonthDay - (monthFirstWeek - 2);
System.out.println(c.get(Calendar.YEAR) + "年" + (c.get(Calendar.MONTH) + 1) + "月");
System.out.println("一\t二\t三\t四\t五\t六\t日");
for (int i = 1; i < monthFirstWeek; i++) { // 打印上个月遗留下的日期
System.out.print(startWeek++ + "\t");
week++;
}
while (day <= getMonthMax(c.get(Calendar.YEAR), c.get(Calendar.MONTH) + 1)) { // 不超过最大日期
if (week > 7) {
week = 1; // 重置星期并换行
System.out.println();
}
if (day == c.get(Calendar.DATE)) { // 是今天就要加*号
System.out.print(day + "*\t");
} else {
System.out.print(day + "\t");
}
week++;
day++;
}
day = 1;
while (week++ <= 7) { // 这个月最后一周要用下个月的日期补满
System.out.print(day + "\t");
day++;
}
}
/**
* @param Week_Of_Month:今天在第几周
* @param Day_Of_Week:今天是周几
* @param Day_Of_Month:今天是几号
* @return return 这个月1号是星期几
*/
public static int getMonthOneWeek(int Week_Of_Month, int Day_Of_Week, int Day_Of_Month) {
// 控制每周从星期1开始还是星期2
if (Day_Of_Week == 1) {
Day_Of_Week = 7;
Week_Of_Month -= 1; // 国内星期日是在上一周的末尾
} else {
Day_Of_Week -= 1;
}
int Month_First_Day = Day_Of_Week; // 这个月1号是从第几周开始
// 算出这个月的第一周,Day_Of_Week星期是几号
// 这个月第一周星期Day_Of_Week = 今天的日期 - (7*(今天是这个月的第几周-1))
int firstWeekDay = Day_Of_Month - (7 * (Week_Of_Month - 1));
if (firstWeekDay > 0) { // 大于0就说明这个日期是在这个月的
for (int i = firstWeekDay; i > 1; i--) {
Month_First_Day--;
}
} else { // 小于0 就说明是上个月的日期
for (int i = firstWeekDay; i < 1; i++) {
Month_First_Day++;
}
}
return Month_First_Day;
}
/**
* @param Month: 月份
* @param year: 年份
* @return 月份最大日期
*/
public static int getMonthMax(int year, int Month) {
if (Month == 2) {
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
return 29;
} else {
return 28;
}
} else if (Month == 4 || Month == 6 || Month == 9 || Month == 11) {
return 30;
}
return 31;
}
}