Java 刷题,计算日期问题

本文提供了一种解决日期类问题的通用模板,包括从特定日期到另一日期间满足条件的日子数量计算方法。通过三个实例详细解释了如何使用该模板解决实际问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

话不多说直接上例题

例题:

一、从1937年01月01日(周五)到2021年3月20日共有多少个星期一?

public class Main {
    static int[] arr = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    static int year = 1937, month = 1, day = 1, data = 5;

    public static void main(String[] args) {
        int ans = 0;
        while (year != 2021 || month != 3 || day != 20) {

            if (year % 4 == 0 || (year % 4 == 0 && year % 100 != 0)) {
                arr[2] = 29;
            } else {
                arr[2] = 28;
            }

            if (check()) {
                ans++;
            }
            day++;
            data++;
            if (data > 7) {
                data = data % 7;
            }

            if (day > arr[month]) {
                month++;
                day = 1;
            }
            if (month > 12) {
                month = 1;
                year++;
            }
        }
        System.out.println(ans);
    }

    static boolean check() {
        int a = year, b = month, c = day, d = data;
        if (data % 7 == 1) {
            return true;
        }
        return false;
    }
}

答案输出:4394

二、1949 年的国庆节( 10 月 1 日)是星期六。今年(2012)的国庆节是星期一。那么,从建国到现在,有几次国庆节正好是星期日呢?不要求写出具体是哪些年,只要一个数目!

public class Main {
    //静态变量(全局变量)
    static int[] arr = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    static int year = 1949, month = 10, day = 1, data = 6;
    //data=0表示周天,data=1表示周一,data=6表示周六。

    public static void main(String[] args) {
        int ans = 0;
        while (year != 2012 || month != 10 || day != 1) {
            //判断是否是闰年
            if (year % 4 == 0 || (year % 4 == 0 && year % 100 != 0)) {
                arr[2] = 29;
            } else {
                arr[2] = 28;
            }

            if (check()) {
                ans++;
            }
            day++;
            data++;
            data = data % 7;

            if (data > 7) {
                data = data % 7;
            }

            if (day > arr[month]) {
                month++;
                day = 1;
            }
            if (month > 12) {
                month = 1;
                year++;
            }
        }
        System.out.println(ans);
    }
    //check()函数用来判断是否符合题意

    static boolean check() {
        int a = year, b = month, c = day, d = data;
        return b==10&&c==1&&d==0;
    }
}

三、

小蓝特别喜欢 2,今年是公元 2020年,他特别高兴,因为每天日历上都可以看到 2。如果日历中只显示年月日,请问从公元 1900 年 1 月 1 日元 9999年 12 月 31 日,一共有多少天日历上包含 2。即有多少天中年月日的数位中包含数字 2。

public class Main {
    static int[] arr = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    static int year = 1900, month = 1, day = 1;

    public static void main(String[] args) {
        int ans = 0;
        while (year != 9999 || month != 12 || day != 31) {
            //是否是闰年
            if (year % 400== 0 || (year % 4 == 0 && year % 100 != 0)) {
                arr[2] = 29;
            } else {
                arr[2] = 28;
            }
            //判断是否合法(判断是否符合题目要求)
            //先判断再++,到最后一天已经结束循环
            if (check()){
                ans++;
            }
            day++;

            if (day > arr[month]) {
                month++;
                day = 1;
            }
            if (month > 12) {
                month = 1;
                year++;
            }
        }
        System.out.println(ans + 1);
    }

    static boolean check() {
         //不能直接操作year,month,day,因为是全局变量.
        //判断年份有没有2
        int a = year;
        while (a > 0) {
            if (a % 10 == 2) {
                return true;
            }
        }
        //判断月有没有2
        int b = month;
        while (b > 0) {
            if (b % 10 == 2) {
                return true;
            }
        }
        //判断日有没有2
        int c = day;
        while (c > 0) {
            if (c % 10 == 2) {
                return true;
            }
        }
        return false;
    }
}

总结

总的来说日期类问题除使用Calender类和Data类外,以上题型均可用日期类模板,如下:

public class Main {
    //静态变量(全局变量)

    static int[] arr = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    static int year = 开始年份, month = 开始月份, day = 开始日期;

    public static void main(String[] args) {
        int ans = 0;
 
        while (year != 截止年份 || month != 截止月份 || day != 截止日期) {

        //判断是否是闰年
            if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
                arr[2] = 29;
            } else {
                arr[2] = 28;
            }

          //check()函数用来判断是否符合题意(是否合法)

            if (check()) {
                ans++;//计数器
            }
            day++;

             //如果日期大于每个月的天数则月份更新,month++,日期day更新为1。
            if (day > arr[month]) {
                month++;
                day = 1;
            }
             //如果月份超过12月,月份更新为1月,年数+1.
            if (month > 12) {
                month = 1;
                year++;
            }
        }
       
        System.out.println(ans);

    }


//check()函数用来判断是否符合题意
    static boolean check() {
        //不能直接操作year,month,day,因为是全局变量.
        int a = year, b = month, c = day;
        //下面写代码进行判断是否合法



        return false;
    }
}

固定模板套用即可。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

优雅的水晶裤头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值