JAVA实现月历的输出【万年历】最新

/*
案例要求:根据用户输入的年份和月份,打印出当前月的月历
分析:
1.写出方法,实现判断是否是闰年
2.写出方法,计算某一个月的天数
3.写出方法,计算当前的月份,距离1900年1月1日的总共天数
(前提:已知1900年1月1日,是星期一)
4.明白一个月的第一天是周几,因此要写出方法,求出月历前面需要空的格数
1号是星期几,前面就空几格
*/
import java.util.Scanner;

public class ChineseCalendar {
public static void main(String[] args) {
//创建一个Scanner对象
Scanner sc = new Scanner(System.in);

    //从键盘输入年月
    System.out.println("请输入年份,格式为:yyyy");
    int year = sc.nextInt();
    System.out.println("请输入月份,格式为:MM");
    int month = sc.nextInt();

    //调用方法,打印月历
    printCalendar(year, month);
}

/**
 * 根据所输的年月打印万年历
 * @param year 所输的年份
 * @param month 所输的月份
 */
public static void printCalendar(int year, int month) {
    //打印表头
    System.out.println("-----" + year + "年" + month + "月日历为-----");
    System.out.println("周日\t周一\t周二\t周三\t周四\t周五\t周六");

    //打印当月1号前需要空出的位置
    int kongGe = getKongGeCount(year, month);  //空格的数量
    for (int i = 1; i <= kongGe; i++) {
        System.out.print("  \t");
    }

    //打印月中的数字
    int day = getDaysOfMonth(year, month);  //当月天数
    for (int i = 1; i <= day; i++) {
        System.out.print(i + "\t");
        //如果一行排满,就换行
        if ((i + kongGe) % 7 == 0) {
            System.out.println();
        }
    }
}

/**
 * 求所输月份的第一天前面所空的格数
 * @param year 所输的年份
 * @param month 所输的月份
 * @return
 */
public static int getKongGeCount(int year, int month) {
    //所输月份的第一天是星期几,前面就空几格
    int count = getTotalDays(year, month) % 7 + 1;
    //如果空格数为7,将其置为0
    if (count == 7) {
        count = 0;
    }
    return count;
}

/**
 * 当月的1号,距离1900年1月1号的总天数
 * @param year 所输的年份
 * @param month 所输的月份
 * @return
 */
public static int getTotalDays(int year, int month) {
    int sumDays = 0;  //总天数

    //先求所有年的天数总和
    for (int i = 1900; i < year; i++) {
        sumDays += isLeapYear(i) ? 366 : 365;
    }

    //再求当年所输月份之前的总天数
    for (int i = 1; i < month; i++) {
        sumDays += getDaysOfMonth(year, i);
    }

    return sumDays;
}

/**
 * 计算某月份的天数
 * @param year 年份
 * @param month 月份
 * @return
 */
public static int getDaysOfMonth(int year, int month) {
    int day = 0;  //整月的天数

    switch (month) {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            day = 31;
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            day = 30;
            break;
        case 2:
            day = isLeapYear(year) ? 29 : 28;
            break;
    }

    return day;
}

/**
 * 判断是否是闰年
 * @param year 年份
 * @return
 */
public static boolean isLeapYear(int year) {
    //能被4整除但不能被100整除,或则能被400整除的年份都是闰年
    if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) {
        return true;
    }
    else {
        return false;
    }
}

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值