欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

对比两种日历的实现方式的感受

程序员文章站 2022-04-19 13:32:04
日历的两种实现方式第一种实现方式核心代码第二种实现方式核心代码运行结果图对比总结第一种实现方式第一种方式是在初学Java时运用面向过程的思维方式来实现的日历显示核心代码import java.util.Scanner;public class MyCalendar {private int year=2020;private int month=6;public MyCalendar(int year,int month) {this.year = year;thi...

第一种实现方式

第一种方式是在初学Java时运用面向过程的思维方式来实现的日历显示

核心代码

import java.util.Scanner;

public class MyCalendar {

	private int year=2020;
	private int month=6;
	
	public MyCalendar(int year,int month) {
		this.year = year;
		this.month = month;
	}
	
	/**
	 * 	判断是否闰年方法
	 * @return
	 */
	public boolean isLeapYear(int year) {
		if(year % 400 == 0 || (year % 4==0 && year % 100 != 0)) {
			return true;
		}
		return false;
	}
	
	/**
	 * 	计算从1900年1月到当前月份(不包含)的总天数
	 *  1900年1月~2020年6月 
	 * @return
	 */
	public int getTotalDayFrom1900() {
		//临时变量,用于统计从1900开始到当前月份(不包含)的总天数
		int totalDay = 0;
		//计算整年的总天数
		for(int i = 1900;i < year;i++) {
			totalDay += isLeapYear(i) ? 366 : 365;
		}
		//累计当前年份1月到当前月上一个月的总天数
		for(int i = 1;i < month;i++) {
			totalDay += getDayOfMonth(i);
		}
		return totalDay;
	}
	
	/**
	 * 	返回指定月份有多少天
	 * @param month
	 * @return
	 */
	public int getDayOfMonth(int month) {
		switch(month) {
		case 4:
		case 6:
		case 9:
		case 11:
			return 30;
		case 2:
			return isLeapYear(year) ? 29 : 28;
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			return 31;
		default:
				return 0;
		}
	}
	
	/**
	 * 	返回日历输出前需要留的空格数
	 * @return
	 */
	public int getSpace() {
		return getTotalDayFrom1900() % 7;
	}
	
	/**
	 * 显示日历
	 */
	public void show() {
		System.out.println("=====================================================");
		System.out.println("===================【"+year+"】年【"+month+"】月================");
		System.out.println("一\t二\t三\t四\t五\t六\t日");
		System.out.println("=====================================================");
		//计数器,统计是否到达7
		int count = 0;
		//输出空格
		for(int i = 1;i <= getSpace();i++) {
			System.out.print("\t");
			count++;
		}
		//获得当前月份的总天
		int day = getDayOfMonth(month);
		//输出数字
		for(int i = 1;i <= day;i++) {
			System.out.print(i+"\t");
			count++;
			//一旦计数器到达7的倍数,则说明已经过完一周,换行输出
			if(count % 7 == 0) {
				System.out.println();
			}
		}
	}
	
	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();
		MyCalendar mc = new MyCalendar(year, month);
		mc.show();
	}
	
}

第二种实现方式

第二种实现方式则是在学习Java一段时间后接触了Java中一些比较常用的类和方法之后用新的方法来重新实现日历的显示

核心代码

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

public class MyCalendar {
	
	public void getDay(int year,int month) {
		Calendar c = Calendar.getInstance();
		c.set(Calendar.YEAR, year);
		c.set(Calendar.MONTH, month - 1);
		c.set(Calendar.DAY_OF_MONTH,1);
		
		int count = 0;
		for (int i = 0; i < c.get(Calendar.DAY_OF_WEEK) -1; i++) {
			System.out.print("  " + "\t");
			count++;
		}
		for (int i = 1; i <= c.getActualMaximum(Calendar.DAY_OF_MONTH); i++) {
			System.out.print(i + "\t");
			count++;
			if(count == 7) {
				System.out.println();
				count = 0;
			}
		}
	}
	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("=====================================================");
		System.out.println("==================【"+year+"】年【"+month+"】月=================");
		System.out.println("一\t二\t三\t四\t五\t六\t日");
		System.out.println("=====================================================");
		new MyCalendar().getDay(year, month);
	}
}

运行结果图

对比两种日历的实现方式的感受
对比两种日历的实现方式的感受

对比总结

两种实现的方法结果的运行图是一模一样的但是代码量却相差甚多,主要的原因是因为前者的大量代码用于计算从1900年1月1日至上个月末的总天数,其中还包括闰年闰月的判断和每月天数是30天还是31天的判断,再来计算总天数,来确定查询月份的第一天是从星期几开始的然后依次输出后面的天数;而第二种看起来则相对简单了很多,主要是运用了JDK中的内置类Calendar类中封装的各种方法,例如向getActualMaximum();中传入Calendar.DAY_OF_MONTH可直接获取当月的最大的天数,则省去了第一种方法中对于每月天数的判断,而向get();中传入Calendar.DAY_OF_WEEK可直接获取到希望查询的月份的第一日是星期几,就不用再去计算从1900年一月一日至查询月份上个月末的总天数,使用内置的方法不仅使我们的代码量大大减少,提升了我们代码的可读性,也体现出面向对象编程相较于面向过程编程的明显不同的侧重点。

本文地址:https://blog.csdn.net/PAL_1024/article/details/107148226