Java基础-输入年份和月份推算出本月并打印星期

本文介绍了一种算法,用于计算指定年月日是星期几。通过确定从1900年1月1日至目标日期的总天数,结合闰年判断和每月天数计算,得出目标日期所在的星期。代码使用Java实现,包括读取用户输入的年份和月份,判断闰年,计算每月天数等关键步骤。

先来看一下效果:

time_1

思路:我们发现最简单的日期就是1900年1月1日,当天是星期一,那么可以用这一天推算,先算出输入的年份和月份距离上一个月总共有多少天,并且上个月最后一日是星期几,最后再算出输入月份天数,开始的星期是上一个月最后一日加上一日。

好了,我们开始看看逻辑代码,首先是scanner类,主要接收键盘输入参数:

Scanner scan=new Scanner(System.in);
System.out.println("请输入年份");
int year=scan.nextInt();
System.out.println("请输入月份");
int mouth=scan.nextInt();

得到输入的年份和月份,然后定义打印星期几的数组并输入:

String arr[]=new String[]{"日","一","二","三"
                ,"四","五","六"};
for(int i=0;i<arr.length;i++){
    System.out.print(arr[i]+"\t");
}
//回车换行,等待真正的日期输出
System.out.println();

定义日期

int Eyear=1900;		//最早的年份
int Eday=1;			//1900年的第一天是星期一
int sumDay=0;		//统计1900年到今年之前共有多少天,不包括到本年本月

首先统计1900年和输入年份总共有多少天,这里涉及当年是不是闰年,判断闰年方法是:当年是不是能被4整除并且不能被100整除,又或者是当年能不能被400整除,那么得到算法。

//判断是否是闰年
public static boolean isT(int year){
   if((year%4==0&&year%100!=0)||year%400==0){
        return true;
   }else{
        return false;
   }
}
/*
思路:  首先统计上一年到1900年工有多少天,%7取余获得最后一天星期几.
统计1900年到输入的上一年有多少天
*/
for(int i=Eyear;i<year;i++){
    if(isT(i)==true){
        sumDay+=366;
    }else{
        sumDay+=365;
    }
}
//计算一年之中到这月有多少天
public static int Hday(boolean TF,int mouth){
    switch(mouth){
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            return 31;
        case 2:
            if(TF){
                return 29;
            }
            return 28;
        case 4:
        case 6:
        case 9:
        case 11:
            return 30;
    }
    return 0;
}
//统计今年到这月的日数,,再加上上一年最后的星期几除以7取余
int tDay=0;
for(int i=0;i<mouth;i++){
    tDay+=Hday(isT(year),i);
}

//总共多少天到上一个月尾共多少天
sumDay+=tDay;

然后打印空格,星期几就打印多少个空格

//打印空格 上个月月尾是星期几就打印多少个+1空格,因为从星期日开始
 for (int i=0;i<=endDay;i++){
     System.out.print("\t");
 }

统计输入月份的上一个月最后一天是星期几,算法就是,因为1900年的第一日是星期1,所以要从星期1这里开始计算,如果第一天是星期二,那么就是从星期二开始计算,每7日作为一个周期,因为我这里采取的是星期一就是0的开始,所以这里要-1,

//统计到上一个月尾是星期几 0是星期日
int endDay=(Eday-1+sumDay)%7;

然后开始统计输入当月有多少天

//统计今个月有多少天
int Tmouth=Hday(isT(year),mouth);

然后再打印当前月份的星期,开始为上一个月的最后一天星期几加上

int enter=endDay;//换行,从上个月月尾星期开始统计,6+1/7==1就换行,并重置enter
//星期一就等于1
for(int i=1;i<=Tmouth;i++){
    System.out.print(i+"\t");
    enter+=1;
    if((enter+1)%7==0){
        System.out.println();
        enter=-1;		
    }
}

完整代码:

import java.util.Scanner;

public class Demo01 {
    public static void main(String arg[]){
        Scanner scan=new Scanner(System.in);
        System.out.println("请输入年份");
        int year=scan.nextInt();
        System.out.println("请输入月份");
        int mouth=scan.nextInt();
       // String arr[]=new String[]{"星期日","星期一","星期二","星期三"
         //       ,"星期四","星期五","星期六"};
        String arr[]=new String[]{"日","一","二","三"
                ,"四","五","六"};
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+"\t");
        }
        //回车换行,等待真正的日期输出
        System.out.println();
        int Eyear=1900;		//最早的年份
        int Eday=1;			//1900年的第一天是星期一
        int sumDay=0;		//统计1900年到今年之前共有多少天,不包括到本年本月

	/*
	思路:  首先统计上一年到1900年工有多少天,%7取余获得最后一天星期几.
	统计1900年到输入的上一年有多少天
	*/
        for(int i=Eyear;i<year;i++){
            if(isT(i)==true){
                sumDay+=366;
            }else{
                sumDay+=365;
            }
        }

        //统计今年到这月的日数,,再加上上一年最后的星期几除以7取余
        int tDay=0;
        for(int i=0;i<mouth;i++){
            tDay+=Hday(isT(year),i);
        }

        //总共多少天到上一个月尾共多少天
        sumDay+=tDay;

        //统计到上一个月尾是星期几 0是星期日
        int endDay=(Eday-1+sumDay)%7;

        //System.out.print("endDay="+endDay);

        //统计今个月有多少天
        int Tmouth=Hday(isT(year),mouth);

        //打印空格 上个月月尾是星期几就打印多少个+1空格,因为从星期日开始
        for (int i=0;i<=endDay;i++){
            System.out.print("\t");
        }

        //打印开始
        int enter=endDay;//换行,从上个月月尾星期开始统计,6+1/7==1就换行,并重置enter
        //星期一就等于1
        for(int i=1;i<=Tmouth;i++){
            System.out.print(i+"\t");
            enter+=1;
            if((enter+1)%7==0){
                System.out.println();
                enter=-1;		
            }
        }



        //方便看代码名称
        System.out.println("");
        System.out.println("测试");
        System.out.println(sumDay%7);
        System.out.println("今年月头到上一个月尾共"+tDay+"天");
        System.out.println("1900.1.1到上一个月共有"+sumDay+"天");
        System.out.println("上个月最后一天是星期"+endDay);
        System.out.println("这个月有"+Tmouth+"天");

    }


    //判断是否是闰年
    public static boolean isT(int year){
        if((year%4==0&&year%100!=0)||year%400==0){
            return true;
        }else{
            return false;

        }
    }

    //计算一年之中到这月有多少天
    public static int Hday(boolean TF,int mouth){
        switch(mouth){
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                return 31;
            case 2:
                if(TF){
                    return 29;
                }
                return 28;
            case 4:
            case 6:
            case 9:
            case 11:
                return 30;
        }
        return 0;
    }

}

 

public class MyDate { private int year; private int month; private int day; // 无参构造方法 public MyDate() { this.year = 2024; this.month = 1; this.day = 1; } // 带参构造方法 public MyDate(int year, int month, int day) { setYear(year); setMonth(month); setDay(day); } // 判断是否为闰 public boolean isLeapYear(int year) { return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); } // 获取某个月的天数 private int getDaysInMonth(int year, int month) { switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 4: case 6: case 9: case 11: return 30; case 2: return isLeapYear(year) ? 29 : 28; default: return 0; } } // setter 方法 public void setYear(int year) { if (year >= 1900 && year <= 2100) { this.year = year; // 重新验证日期(特别是2月份) if (day > getDaysInMonth(year, month)) { this.day = getDaysInMonth(year, month); } } else { System.out.println("年份必须在1900-2100之间"); } } public void setMonth(int month) { if (month >= 1 && month <= 12) { this.month = month; // 重新验证日期 if (day > getDaysInMonth(year, month)) { this.day = getDaysInMonth(year, month); } } else { System.out.println("月份必须在1-12之间"); } } public void setDay(int day) { int maxDays = getDaysInMonth(year, month); if (day >= 1 && day <= maxDays) { this.day = day; } else { System.out.println("日期必须在1-" + maxDays + "之间"); this.day = 1; // 设置为默认值 } } // getter 方法 public int getYear() { return year; } public int getMonth() { return month; } public int getDay() { return day; } @Override public String toString() { return year + "-" + (month < 10 ? "0" + month : month) + "-" + (day < 10 ? "0" + day : day); } // 测试方法 public static void main(String[] args) { // 创建日期1:2024-12-31(闰) MyDate date1 = new MyDate(2024, 12, 31); System.out.println("日期1:" + date1); // 创建日期2:1900-11-15(平) MyDate date2 = new MyDate(1900, 11, 15); System.out.println("日期2:" + date2); // 测试闰判断 System.out.println("2024是闰吗?" + date1.isLeapYear(2024)); System.out.println("1900是闰吗?" + date2.isLeapYear(1900)); // 修改日期2的年份为2000(闰),月份改为10月,日期改为25日 date2.setYear(2000); date2.setMonth(10); date2.setDay(25); System.out.println("修改后的日期2:" + date2); System.out.println("2000是闰吗?" + date2.isLeapYear(2000)); } }帮我运行这个代码
10-21
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值