万年历(java)

1. 计算某一天是星期几

在这里插入图片描述

import java.util.Scanner;
public class Demo1{
	public static void main(String[] args){
		//要求用户输入一个年月日 计算出用户输入的年月日时星期几
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入年份");
		int year=sc.nextInt();
		System.out.println("请输入月份");
		int month=sc.nextInt();
		System.out.println("请输入天数");
		int day=sc.nextInt();

		int totalDay=0;
		//1:计算经过的整年的天数(整年是从1900开始到用户输入的年份的前一年(例如用户输入的是2020 整年应该是1900--2019))
		for(int i=1900;i<year;i++){
			//计算1900 1901 1902... i是代表年份的增长也就是经过的每一年 year是固定值
			if((i%4==0 && i%100!=0) || (i%400==0)){
				totalDay+=366;
			}else{
				totalDay+=365;
			}
		}
		//2:计算经过的整月的天数(1--12)(整月是从1月开始到用户输入的前一个月 例如用户输入的是10月 整月就是1--9)
		for(int i=1;i<month;i++){
			switch(i){
				case 1:
				case 3:
				case 5:
				case 7:
				case 8:
				case 10:
				case 12:
					totalDay+=31;
					break;
				case 4:
				case 6:
				case 9:
				case 11:
					totalDay+=30;
					break;
				case 2:
					if((year%4==0 && year%100!=0) || (year%400==0))
						totalDay+=29;
					else
						totalDay+=28;
					break;
			}
		}
		//3:计算经过的天数
		totalDay+=day;
		//加入输入的年份是2020年3月 
		//totalDay没有加1的话 日期是计算到 2020年2月29或者28

		//程序执行到这个地方 例如用户输入的是2020年3月 求3月1号是星期几 整年2019年12月31号 循环加上月份 月份只加到2月最后一天
		//求3月1号 3月的1号 1这一天是不是需要加上

		//2020年1月1号这一天星期几 只加上了2019年之前整年的天数  2019年12月31日 


		int week=totalDay%7;
		if(week==0)
			week=7;

		System.out.println(year+"年"+month+"月"+day+"日:是星期"+week);
	}
}

2. 打印月份

在这里插入图片描述

import java.util.Scanner;
public class Demo2{
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入年份:");
		int year=sc.nextInt();
		System.out.println("请输入月份:");
		int month=sc.nextInt();

		int totalDay=0;
		//1:计算从1900年1月1号 到用户输入的年份的整年的天数 1900--用户输入的年份的前一年
		for(int i=1900;i<year;i++){
			if((i%4==0 && i%100!=0) || (i%400==0)){
				totalDay+=366;
			}else{
				totalDay+=365;
			}
		}

		//2:计算用户输入的年份的经过月份的天数(例如用户输入的是2020年10月 加上2020年1月--9月的总天数)
		for(int i=1;i<month;i++){
			switch(i){
				case 1:
				case 3:
				case 5:
				case 7:
				case 8:
				case 10:
				case 12:
					totalDay+=31;
					break;
				case 4:
				case 6:
				case 9:
				case 11:
					totalDay+=30;
					break;
				case 2:
					if((year%4==0 && year%100!=0) || (year%400==0))
						totalDay+=29;
					else
						totalDay+=28;
					break;
			}
		}

		//计算用户输入的月份的天数(2020年10月 求10月1号这一天 前面加到2020年9月30号 因为10月还有一天)
		// totalDay++;
		//计算用户输入的年份和月份的第一天是星期几
		int week=(totalDay+1)%7;

		// ++totalDay  和  totalDay+1   totalDay是不一样的    ++totalDay的值 比 totalDay+1 要大1

		System.out.println(week);

		System.out.println("星期天\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
		//按照现在的日历格式 统计出来当前月的1号是星期几 那么前面就应该出现多少个\t
		//如果当前的1号是星期天 那么week是0 刚好一个\t都不输出 输出\t的循环 i是从0开始 
		for(int i=0;i<week;i++){
			System.out.print("\t");
		}

		//问题:当前月的天数 输出截止数 下面的循环我现在不确定用户输入的月份的天数(31/30/29/28)
		//计算用户输入的月份的天数
		int monthDay=31;
		switch(month){
				case 4:
				case 6:
				case 9:
				case 11:
					monthDay=30;
					break;
				case 2:
					monthDay=((year%4==0 && year%100!=0) || (year%400==0))?29:28;
					break;
			}

		//输出日期(从1号开始到当前月的截止)
		for(int i=1;i<=monthDay;i++){
			//一个星期只有7天 那么控制换行的
			System.out.print("  "+i+"\t");
			//控制换行(输出的月份的1号是星期四那么输出到星期六以后要换行)  输出的月份的1号是星期二 那么 输出到星期六要换行
			//控制换行的第一种方式
			//totalDay%7余数是当前月的1号的星期四  同样的推理 2号是星期五  3号是星期六 3
			// if((totalDay+i)%7==6){
			// 	System.out.print("\n");
			// }
			//控制换行的第二种方式
			//week 是当前月的1号的星期几 例如week是4  2 5  3 6  (week+i)%7==0 
			if((week+i)%7==0)
				System.out.println();
		}
		System.out.println();
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_45773503/article/details/106818421