A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

/**需求:输入年份和月份的可以知道当月有多少天,并且知道当月的1号是星期几
* 万年历分析:
* 1.从1900.1.1号到现在的总天数,拿总天数对7取余得到当月是星期几
* 2.要知道能被4整除,并且不能被100整除 || 能被400整除的是闰年, 否则就是平年,闰年是366天,平年365天
* 3.不管是平年还是闰年:4,6,9,11都是30天,1,3,5,7,8,10,12都是31天
*                 就是2月份有不同:
*                         闰年:29天
*                         平年是:28天
* 1.先计算1900到当前月的有多少天
* 2.然后拿总天数对7取余就得到当前月的1号是星期几
* @author 1
*
*/
public class CaLenDar {
        int year;
        int month;
       
        public void init() {
                Scanner sc = new Scanner(System.in);
                do {
                        System.out.println("请输入年份:");
                        year = sc.nextInt();
                }while(year<1900);
               
                do {
                        System.out.println("请输入月份:");
                        month = sc.nextInt();
                }while(month<1 || month>12);
                //计算总天数
                //先算1900到输入的年份有多少年,因为有闰年和平年的存在,所以要进行判断如果是闰年就是加366天(想到这里就要定义一个求和变量)
                int total=0;
                for(int i=1900; i<year; i++) {
                        if(i%4==0 &&  i%100!=0 || i%400==0) {
                                //如果满足这个条件说明是个闰年
                                total+=366;
                        }else {
                                total+=365;
                        }
                }
                //计算月份
                int yueDays=0;
                for(int i=1; i<month; i++) {
                        if(i==4 || i==6 || i==9 || i==11) {
                                //不管平年还是闰年都是30天
                                yueDays += 30;
                        }else if(i == 2) {//是2月份,就要分闰年和平年
                                if(year%4==0 && year%100!=0 || year%400==0) { //这里要传入年份,所以等下要把他封装成方法的时候,要传入年份这个参数
                                        //闰年的二月份是29天
                                        yueDays += 29;
                                }else {
                                        yueDays += 28;
                                }
                        }else {//这里就是1,3,5……月是31天
                                yueDays += 31;
                        }
                }
                //然后把之间的年份和月份的天数加起来就是总天数
                total+=yueDays;
                total+=1;//不知道为什么
                System.out.println("总天数:"+total);
                int weekday = total%7;//总天数对7取余得到的值是多少就对他输出几个空格,就可以得到当月的1号是星期几
                System.out.println("当月的1号是星期"+weekday);
                System.out.println("星期日"+"\t星期一"+"\t星期二"+"\t星期三"+"\t星期四"+"\t星期五"+"\t星期六");
                for(int x=0; x<weekday; x++) {
                        System.out.print("\t");
                }
                //写一个获取当月有多少天的方法
                int day = getDays(year, month);
                //遍历这个天数如果weekDay+1%7==0就换行,天数没有0,所以从1开始
                for(int x=1; x<=day; x++) {
                        System.out.print(x+"\t");
                        if((weekday+x)%7==0) {
                                System.out.println();
                        }
                }
               
        }
        public int getDays(int year, int month) {//为什么要传年份,因为后面二月份要区别是闰年还是平年
                int day = 0;
                switch (month) {
                case 4:
                case 6:
                case 9:
                case 11:
                        day = 30;
                        break;
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                case 12:
                        day = 31;
                        break;
                case 2:
                        if(year%4==0 && year%100!=0 || year%400==0) {//因为太多地方要用这个判断平年和闰年的语句所以最好封装成一个方法
                                day = 29;
                        }else {
                                day = 28;
                        }
                default:
                        break;
                }
                return day;
        }

}

//在另一个测试类中测试

public class CaLenDarTest {
        public static void main(String[] args) {
                CaLenDar c = new CaLenDar();
                c.init();//2008是闰年
        }
}







3 个回复

倒序浏览
回复 使用道具 举报
奈斯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马