案例:生成日历
从1990年1月1日算起,输入需要查询的年份与月份,在控制台中打印日历
package com.lession.example;
import java.util.Scanner;
/**
* 思路:
* 1、先计算总天数 --- 判断是否是闰年
* 1.1 先计算整年的天数加上
* 1.2 再计算当年月份的天数
* 2、计算当前月份第一天前面的空格数
* 3、输出空格、输出日期
*/
public class MyCalendar {
/**
* 打印指定年份和月份
*
* @param year
* @param month
*/
private static void printCalender(int year, int month) {
// 获取从1900年1月1日到当前月份前一个月的总天数
int days = getTotalDaysFrom1900(year, month);
// 计算获取当前月份第一天前面的的空格数
int space = days % 7;
// 获取本月的总天数
int now = getDaysOfMonth(year, month);
// 输出空格
for (int i = 0; i < space; i++) {
System.out.print("\t");
}
// 输出日期
for (int i = 1; i <= now; i++) {
space++; // 将空格变量作为计时器
System.out.print(i + "\t");
// 达到7的倍数换行
if (space % 7 == 0) {
System.out.println();
}
}
}
/**
* 获取从1900年1月到当前月份的前一个月的天数
*
* @return
*/
private static int getTotalDaysFrom1900(int y, int m) {
int days = 0;
// 先统计整年的总天数
for (int i = 1900; i < y; i++) {
days += isLeapYear(i) ? 366 : 365;
}
// 再统计整月的总天数
for (int i = 1; i < m; i++) {
days += getDaysOfMonth(y, i);
}
return days;
}
/**
* 获取指定年份中某一个年份的总天数
*
* @param year
* @param i
* @return
*/
private static int getDaysOfMonth(int year, int i) {
switch (i) {
case 2:
return isLeapYear(year) ? 29 : 28;
case 4:
case 6:
case 9:
case 11:
return 30;
default:
return 31;
}
}
/**
* 判断目标年份是否是闰年
*
* @param year
* @return
*/
public static boolean isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入年份:");
int year = sc.nextInt();
System.out.print("请输入月份:");
int month = sc.nextInt();
System.out.println("============================");
System.out.println("\t万年历\t" + year + "年" + month + "月");
System.out.println("============================");
System.out.println("一\t二\t三\t四\t五\t六\t日");
System.out.println("============================");
printCalender(year, month);
}
}
如果有错误,请在评论区或者私聊
谢谢