Java小案例——万年历(打印一个简单的日历)
今天我们用Java来实现一个小的案例,输入年和月,打印当月的日历。
实现如下效果:
但是我们并不能确定用户输入的当前年份下当月的第一天是星期几,现在有一个线索提供如下:
1900年1月1日 – 星期一
我们通过这个线索来获取从1900年1月1日到输入年和输入月的总天数,然后用这个总天数与7做余数,通过余数来确定输入年月的第一天是星期几(整除就将余数设置为7)
首先我们需要通过调用Scanner类来提示用户输入正确的年份和月份:
while(true){ System.out.println("请输入年份:"); int year = scanner.nextInt(); if (year < 0) { System.out.println("请输入正确的年份!"); continue; } System.out.println("请输入月份:"); int month = scanner.nextInt(); if (month < 0 || month > 12) { System.out.println("请输入正确的月份!"); continue; } }
那么怎么计算总天数呢?我的思路是:把年和月拆分出来,先算1900~输入年的总天数,再算1月到输入月的总天数
// 获取年的总天数 int allDaysOfYear = 0; for (int i = 1900; i < year; i++) { if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {// 闰年 allDaysOfYear += 366; } else {// 平年 allDaysOfYear += 365; } } // 获取月的总天数 int allDaysOfMonth = 0; for (int i = 1; i < month; i++) { switch (i) { case 1:case 3:case 5:case 7:case 8:case 10:case 12: allDaysOfMonth += 31; break; case 4:case 6:case 9:case 11: allDaysOfMonth += 30; break; case 2: if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {// 闰年 allDaysOfMonth += 29; } else {// 平年 allDaysOfMonth += 28; } break; } } // 获取总天数 -- 获取到1900.1.1~输入年输入月的第1天的总天数 int allDays = allDaysOfYear + allDaysOfMonth + 1;
接着我们就要算输入的年份和月份的第一天是星期几:
// 计算星期 int week = allDays % 7; if (week == 0) {// 说明这是星期天 week = 7; } // 获取当月的天数 int days = 0; switch (month) { case 1:case 3:case 5:case 7:case 8:case 10:case 12: days = 31; break; case 4:case 6:case 9:case 11: days = 30; break; case 2: if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {// 闰年 days = 29; } else {// 平年 days = 28; } break; }
最后打印日历即可,注意每个月的第一天都不相同,需要打印相应的空格
// 打印日历 System.out.println("---" + year + "年" + month + "月---"); System.out.println("一\t二\t三\t四\t五\t六\t日"); // 打印换行、逢7换一次行 int count = 0; // 打印空格 for (int i = 1; i < week; i++) { System.out.print("\t"); count++; } // 打印日期 for (int i = 1; i <= days; i++) { System.out.print(i + "\t"); count++; if (count % 7 == 0) { System.out.println(); } }
最后完整源码附上:
import java.util.Scanner; public class Calendar { public static void main(String[] args) { // 调用Scanner类,提示用户输入年份和月份 Scanner scanner = new Scanner(System.in); while (true) { System.out.println("请输入年份:");// 2023 int year = scanner.nextInt(); if (year < 0) { System.out.println("请输入正确的年份!"); continue; } System.out.println("请输入月份:");// 2 int month = scanner.nextInt(); if (month < 0 || month > 12) { System.out.println("请输入正确的月份!"); continue; } // 获取年的总天数 int allDaysOfYear = 0; for (int i = 1900; i < year; i++) { if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {// 闰年 allDaysOfYear += 366; } else {// 平年 allDaysOfYear += 365; } } // 获取月的总天数 int allDaysOfMonth = 0; for (int i = 1; i < month; i++) { switch (i) { case 1:case 3:case 5:case 7:case 8:case 10:case 12: allDaysOfMonth += 31; break; case 4:case 6:case 9:case 11: allDaysOfMonth += 30; break; case 2: if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {// 闰年 allDaysOfMonth += 29; } else {// 平年 allDaysOfMonth += 28; } break; } } // 获取总天数 -- 获取到1900.1.1~输入年输入月的第1天的总天数 int allDays = allDaysOfYear + allDaysOfMonth + 1; // 计算星期 int week = allDays % 7; if (week == 0) {// 说明这是星期天 week = 7; } // 获取当月的天数 int days = 0; switch (month) { case 1:case 3:case 5:case 7:case 8:case 10:case 12: days = 31; break; case 4:case 6:case 9:case 11: days = 30; break; case 2: if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {// 闰年 days = 29; } else {// 平年 days = 28; } break; } // 打印日历 System.out.println("---" + year + "年" + month + "月---"); System.out.println("一\t二\t三\t四\t五\t六\t日"); // 打印换行、逢7换一次行 int count = 0; // 打印空格 for (int i = 1; i < week; i++) { System.out.print("\t"); count++; } // 打印日期 for (int i = 1; i <= days; i++) { System.out.print(i + "\t"); count++; if (count % 7 == 0) { System.out.println(); } } break; } scanner.close(); } }