java实现简单万年历

思路:

1、算出当前月份的第一天与1900/1/1 的天数之差 day 

2、将day%7得到当前月的第一天是星期几

3、循环打印日历

代码实现:

import java.util.Calendar;
import java.util.Scanner;

public class Test {
	
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		//1.万年历
		//实例化两个日历对象,一个设置为1900/1/1 一个设置为你要查询的日期
		Calendar calendar1 = Calendar.getInstance();
		Calendar calendar2 = Calendar.getInstance();
		//年、月
		int year,month;
		System.out.print("请输入年、月:");
		year = input.nextInt();
		month = input.nextInt();
		//分别设置两个日历的年份和月份
		calendar1.set(year,month,1);
		calendar2.set(1900,1,1);
		//月份从0开始,所以设置月份就需要月份-1
		calendar1.set(Calendar.MONTH,month-1);
		int day = getDaysBetween(calendar1,calendar2);
		//将天数差%7得到当前月份第一天是星期几
		day %= 7;
		System.out.println("一\t二\t三\t四\t五\t六\t日");
		//如果day%7==0,表示当前月份第一天是星期日
		if(day == 0)
			day=7;
		//输出day-1个\t
		for(int i = 1; i < day; i++){
			System.out.print("\t");
		}
									//getActualMaximum 获得该月份中天数的最大值
		for(int i = 1; i <= calendar1.getActualMaximum(Calendar.DAY_OF_MONTH); i++){
			System.out.print(i + "\t");
			if((i+day-1)%7 == 0)		//当 (i+day-1)%7 == 0 时,表示当天为星期日,需要换行
				System.out.println();
		}
    }
	/**
	 * 获得两个日期间天数差
	 * @param day1	日期1   用户查询日期
	 * @param day2	日期2 1900/1/1
	 * @return 天数差
	 */
	public static int getDaysBetween(Calendar day1,Calendar day2){
		//得到当前时间在一年中的天数
		int days = day1.get(Calendar.DAY_OF_YEAR);
		//获得用户输入的年份
		int y1 = day1.get(Calendar.YEAR);
		//计算1900/1/1日 与 y1/1/1日的天数差
		if(day2.get(Calendar.YEAR) != y1){
			day2 = (Calendar)day2.clone();
			do{
				days += day2.getActualMaximum(Calendar.DAY_OF_YEAR);
				day2.add(Calendar.YEAR, 1);
			}while(day2.get(Calendar.YEAR) != y1);
		}
		return days;
	}
}

结果:

 

 

 

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java编写的万年历程序 package Day; import java.util.Scanner; public class Day { static int B1=0; //判断是否为闰年,1代表闰年,0代表平年 static int B2; //判断月份的天数,0代表31天,1代表29天,2代表28天,3代表30天 static int DAY1=0; //计算从1900年到今年1月1日的天数 static int DAY2=0; //计算从今年1月1日到本月1日的天数 static int Month_Day=0; //计算本月的天数 static int Y=1900; //代表起始年,1900年 public static void main(String agrs[]){ System.out.println("请输入年份:"); Scanner sc=new Scanner(System.in); int year = sc.nextInt(); System.out.println("请输入月份:"); int month = sc.nextInt(); //计算从1900年到本年1月1日的天数 for(int i=0;i<=year-1900;i++){ year(Y); if(B1==1&&i!=year-1900){ //如果闰年则一年366天 DAY1=DAY1+366; } else if(B1==0&&i!=year-1900){ //如果是平年,则一年有365天 DAY1=DAY1+365; } Y++; } //计算从本年1月1日到本月1日的天数 for(int j=1;j<=month-1;j++){ //j表示从本年一月份一直到上月,month表示本月 month(j); //month(),表示判断月份性质的方法函数 if(B2==0){ //B2==0,表示本月为31天(1,3,5,7,8,10,12月) DAY2=DAY2+31; } else if(B2==1){ //B2==1,表示本月为闰年的2月,有29天 DAY2=DAY2+29; } else if(B2==2){ //B2==2,表示本月为平年的2月,有28天 DAY2=DAY2+28; } else if(B2==3){ //B2==3,表示本月为其他月份30天(4,6,9,11月) DAY2=DAY2+30; } } month(month); //判断本月共多少天 { if(B2==0){ Month_Day=31; } else if(B2==1){ Month_Day=29; } else if(B2==2){ Month_Day=28; } else if(B2==3){ Month_Day=30; } } // System.out.println(DAY1); // System.out.println("本年已过"+DAY2+"天"); int Today=(DAY1+DAY2)%7+1; //判断本月的第一天是星期几 // System.out.println(Today); // System.out.println(Month_Day); // System.out.println("B1="+B1+" "+"B2="+B2); int num=1; //num表示本月的日期,如:1日,2日,3日。。。。。 System.out.print("一\t"+"二\t"+"三\t"+"四\t"+"五\t"+"六\t"+"七\n"); for(int k=1;num<=Month_Day;k++){ //k代表统计显示日历矩阵的日期的个数,当num小于本月的天数,将继续显示num if(k<Today){ //当本月的第一天所处星期几(即:Today)大于k,则说明前面有Today-k是空的 System.out.print("\t"); //空的需要用制表符占位代替 } else if(k>=Today){ //当k等于Today即刻开始显示日期,从num==1开始显示 System.out.print(num+"\t"); num++; if(k%7==0){ System.out.println(""); //当k是7的整数倍的时候需要换行 } } } } public static int year( int year){ if((year%4==0&&year0;!=0)||(year@0==0)){ //System.out.println("这是闰年!"); return B1=1; } else{ //System.out.println("这不是闰年!"); return B1=0; } } public static int month( int month){ if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){ //System.out.println("这个月有31天!"); return B2=0; } else if(month==2&&B1;==1){ //System.out.println("这个月有30天或者28天,或者29天!"); return B2=1; } else if(month==2&&B1;==0){ return B2=2; } else{ return B2=3; } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值