【Java项目1】打印某个月的月历(可拓展为打印某一年的年历)

本文目录

  1. 题目要求
  2. 思路想法
  3. 函数架构
  4. 具体代码

一、题目要求

已知2019年1月1日是星期二,要求输入任意一个年月,即打印出该月份的月历。

实现效果如图:

 

二、思路想法

1.主要是需要获得该月的第一天是星期几,已知2019.1.1是周二,那么可以计算用户输入月的1号与2019.1.1之间的间隔天数,然后间隔天数%7,得到的数再从星期二做相应的偏移。

2.计算总天数的方法

3.计算出总天数以后的偏移

4.整个过程包括要处理客户输入的字符、获得某个月的英文名称用于在月历头部打印,计算某月1号距2019.1.1之间的间隔、计算某年是否为闰年等操作。

 

三、函数架构

 四、具体代码

import java.util.Scanner;

public class PrintCalendar {
	
	//主函数入口
	public static void main(String[] args) {

		Scanner input = new Scanner(System.in);
		
		//获得用户输入的年月数据
		System.out.print("请输入年月(格式:年.月,如2019.9): ");
		String yearAndMonth = input.nextLine();
		//把客户输入的数据分离出年与月,并且转为整数类型
		int year,month;
		year = Integer.parseInt(yearAndMonth.substring(0,yearAndMonth.indexOf('.')));
		month = Integer.parseInt(yearAndMonth.substring(yearAndMonth.indexOf('.')+1));
		
		//打印日历的头部
		printMonthTitle(year,month);
		//打印日历的日期部分
		printMonthbody(year,month);
	}

	//打印日历的头部部分
	public static void printMonthTitle(int year, int month) {
		// TODO Auto-generated method stub
		String nameOfMonth = getNameOfMonth(month);
		System.out.printf("\n%13s-%-13d\n",nameOfMonth,year);
		for(int i=0;i<27;i++) System.out.print('=');
		System.out.println("\nMon Tue Wed Thu Fri Sat Sun");
	}
	
	//获得某个月的英文名称
	public static String getNameOfMonth(int month) {
		// TODO Auto-generated method stub
		String nameOfMonth="January";
		switch(month) {
		case 1: nameOfMonth = "January";break;
		case 2: nameOfMonth = "February";break;
		case 3: nameOfMonth = "March";break;
		case 4: nameOfMonth = "April";break;
		case 5: nameOfMonth = "May";break;
		case 6: nameOfMonth = "June";break;
		case 7: nameOfMonth = "July";break;
		case 8: nameOfMonth = "August";break;
		case 9: nameOfMonth = "September";break;
		case 10: nameOfMonth = "October";break;
		case 11: nameOfMonth = "November";break;
		case 12: nameOfMonth = "Decmber";break;
		}
		
		return nameOfMonth;
	}

	//输出打印的月份日期部分
	public static void printMonthbody(int year, int month) {
		// TODO Auto-generated method stub
		int count=0;
		int firstDayOfMonth=getFirstDayOfMonth(year,month);
		int totalDayOfMonth=getTotalDayOfMonth(year,month);
		
		//打印1号之前的日历空格
		for(int i=1;i<firstDayOfMonth;i++) {
			System.out.print("    ");
			count++;
		}
		//开始从1号开始打印,一直到整个月结束
		for(int day=1;day<=totalDayOfMonth;day++) {
			if(count==7) {
				System.out.print("\n");
				count = 0; 
			}
			System.out.printf("%-4d",day);
			count++;
		}
	}

	//获得某个月的总天数
	public static int getTotalDayOfMonth(int year, int month) {
		//返回各个月的天数
		if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
			return 31;
		else if(month==4||month==6||month==9||month==11)
			return 30;
		else{
			if(isLeapYear(year)) return 29;
			else return 28;
		}
	}

	//算出某月第一天是星期几
	public static int getFirstDayOfMonth(int year, int month) {
		// 返回某个月的第一天是星期几,已知2019-1-1是周二
		int totalDayFrom2019_1_1=0,day=2;
		if(year>=2019) {
			//累加2019年到year之间的所有整年总天数
			if(year>2019) {
				for(int i=2019;i<year;i++) {
					if(isLeapYear(i)){
						totalDayFrom2019_1_1 += 366;
					}else {
						totalDayFrom2019_1_1 += 365;
					}
				}
			}
			//累加该月份到该年1月的总天数
			for(int j=1;j<month;j++) {
				totalDayFrom2019_1_1 += getTotalDayOfMonth(year,j);
			}
		}
		else {
			//累加2019年到year之间的所有整年总天数
			for(int i=year+1;i<2019;i++) {
				if(isLeapYear(i)){
					totalDayFrom2019_1_1 += 366;
				}else {
					totalDayFrom2019_1_1 += 365;
				}
			}
			//累加该月份到该年12月的总天数
			for(int j=12;j>=month;j--) {
				totalDayFrom2019_1_1 += getTotalDayOfMonth(year,j);
				}
		}
		
		//计算得到该月第一天星期几,如果结果为0即刚好被7整除,为星期天
		if(year>=2019) {
			day = ((totalDayFrom2019_1_1%7)+day)%7;
		}else {
			day = (day-(totalDayFrom2019_1_1%7)+7)%7;
		}
		if(day==0) day=7;
		
		return day;
	}
	
	//计算某年是否为闰年
	public static boolean isLeapYear(int year) {
		//判断一个年份是否是闰年
		boolean leapYearOrNot=false;
		if ((year%4==0 && year%100!=0)||year%400==0) {
			leapYearOrNot=true;
		}
		else 
			leapYearOrNot=false;
		return leapYearOrNot;
	}

}

Github地址:https://github.com/better-king/LearnJava/blob/master/src/PrintCalendar.java

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值