打印万年历

这个Java程序用于打印1970年至2050年间的万年历。它通过计算每个月的天数和每周的开始日来实现,包括闰年二月的特殊处理。程序首先定义了一个Days类,包含三个静态方法:getDays()计算月份天数,dayCount()计算指定月份1号是当年的第几天,Week()计算月份1号是星期几。最后,main方法调用printDays()打印指定年份范围内的日历。
摘要由CSDN通过智能技术生成

/**
 * @author 石乐志
 * 打印万年历
 */
public class Demo1 {
    public static void main(String[] args) {
        //调用 Days的printDays() 打印日期的方法
        Days.printDays(2017,2018);
    }

}

class Days {
    
    public static int getDays(int year, int month) {
        //计算每个月的天数
        int days = 1;
        switch (month) {
        case 4:
        case 6:
        case 9:
        case 11:
            days = 30;
            break;
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            days = 31;
            break;
        case 2:
            if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0) {
                days = 29;
            } else {
                days = 28;
            }
            break;
        }
        return days;
    }

    public static int dayCount(int year, int month) {
        /*
         * 计算每个月1号是第多少天
         * 调用了getDays(int year, int month)方法
         * */
        int dayCount = 1;
        for (int i = 1; i < month; i++) {
            //从1号开始,1月1号是1年的第1天,dayCount=1;12月1号是前11个月+1天
            int days = getDays(year, i);
            dayCount += days;
        }
        return dayCount;
    }

    public static int Week(int year, int month) {
        /*
         * 计算每个月1号是星期几
         * 调用了 dayCount(int year, int month)方法
         * */
        int dayCount = dayCount(year, month);
        //调用dayCount()方法,计算当前月份1号是一年的第多少天
        int week = (year - 1 + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400 + dayCount) % 7;
        return week;
    }

    /**
     *
     * @param year1 起始年份
     * @param year2 终止年份
     */
    public static void printDays(int year1, int year2) {
        /*
         * 打印日期
         * 调用了getDays(int year, int month)方法
         * 调用了 Week(int year, int month)方法
         * */
        for (int i = year1; i < year2; i++) {
            //遍历从1970~2050之间的年份
            for (int j = 1; j <= 12; j++) {
                System.out.println("\t" + "\t    " + i + "年" + j + "月");
                //打印 某年某月
                System.out.println(
                        "日" + "\t" + "一" + "\t" + "二" + "\t" + "三" + "\t" + "四" + "\t" + "五" + "\t" + "六" + "\t");
                //打印星期
                int days = getDays(i, j);
                //调用getDays(int year, int month)方法, 获取当月的天数
                int week = Week(i, j);
                //调用Week(int year, int month)方法, 获取当月1号是周几
                int n = 0;// 计算打印空格的次数
                for (int m = 0; m < week; m++) {
                    if (week == 7) {
                        //周天是不用打印空格的,直接终止循环
                        break;
                    }
                    //周几,前面就要打印几个空格
                    System.out.print("\t");
                    n++;// 计算打印空格的次数
                }
                for (int k = 1; k <= days; k++) {
                    System.out.print(k + "\t");
                    if ((k + n) % 7 == 0) {
                        //每打印7次换行, 空格也要计算
                        System.out.println();
                    }
                }
                System.out.println();
            }
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值