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

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

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

先来看一下效果:

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;
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值