万年历的实现,不使用Date类,靠时间计算实现

万年历是通过我们输入年和月就能够得到该月的日历,不使用月历类,仅仅通过逻辑实现.

我们可以先通过查询得出1990年的1月1日是星期一,将这个时间作为基点,通过计算你所要的日历之间的时间差,再通过模7得出该月份1号所对应星期几,具体代码如下:


import java.util.Scanner;


public class PerpetualCalendar {
    public static void main(String[] args) {
        //通过控制台输入要查询的日历
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入年份");
        int year = scanner.nextInt();
        System.out.println("请输入月份");
        int moon = scanner.nextInt();
        //1990.1.1是星期一,通过这个时间点向后计算时间得出要查询的月份1号对应是星期几
        int num = 0;
        //统计年份之间的天数
        for (int i = 1990; i<year; i++) {
            //判断闰年
            if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0){
                num += 366;
            }else {
                num += 365;
            }
        }
        //统计月份的天数
        for (int i = 1; i < moon; i++) {
            if (i == 1 || i == 3|| i == 5 || i == 7 || i == 8 || i == 10 || i == 12 ){
                num += 31;
            }else if (i == 2){
                if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0){
                    num += 29;
                }else {
                    num += 28;
                }
            }else {
                num += 30;
            }
        }
        //计算查询月份有多少天
        int days = 0;
        if (moon == 1 || moon == 3|| moon == 5 || moon == 7 || moon == 8 || moon == 10 || moon == 12 ){
            days = 31;
        }else if (moon == 2){
            if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0){
                days = 29;
            }else {
                days = 28;
            }
        }else {
            days = 30;
        }
        //通过计算年份之间的天数差通过取模运算得出星期几,0-6分别表示一到日;

        int space = num % 7;
        System.out.println("一\t二\t三\t四\t五\t六\t日");
        //刚好通过这个数字计算1号前面要空几个空格,先将空格输出出来
        for (int i = 0; i < space; i++) {
            System.out.print(" "+"\t");
        }
        //接下来将日期输出
        for (int i = 1; i <= days; i++){
            System.out.print(i+"\t");
            //每7个要换行,换行统计时要加上空格数
            if ((i+space) %7 ==0){
                System.out.println();
            }

        }


    }
}

最后显示效果如下图

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值