Java实现一个Date类

/**
*  日期类
* 根据需求列出功能列表
*  1.传 年、月、日  构造日期类
*  2.在当前日期上增加多少天
*  3.在当前日期上减少多少天
*  4.可以返回字符串 String 的方法   "2019-5-30"
*  5.加一些限制 : 年支持的范围 [1900, 2100]
*  6.如果给定两个日期,计算两个日期之间相差多少天
* 设计属性
*  1.年、月、日
*/

public class Date {
	private int year;
	private int month;
	private int day;
	
	//构造方法
	public Date(int year, int month, int day) {
		//至少做基本的参数检查
		if(year < 1900 || year > 2100){
			//最好抛出异常
			System.out.println("年不合法" + year);
			return;
		}
		if(month < 1 || month >12) {
			System.out.println("月不合法" + month);
			return;
		}
		if(day < 1 || day > getDayOfMonth(year,month)) {
			System.out.println("日不合法" + day);
			return;
		}
		
		//涉及 Name Shadow
		this.year = year;
		this.month = month;
		this.day = day;
	}
	
	private Date(Date other) {
		this(other.year, other.month, other.day);
	}
	
	//支持的方法
	public void add(int days) { //这里的 days 如果写成day ,那么使用属性day要用 this
		//days必须是正数
		if(day < 0){
			System.out.println("days不合法" + days);
			return;
		}
		day += days;
		while(day > getDayOfMonth(year,month)) {
			day -= getDayOfMonth(year,month);
			month++;
			if(month > 12){
				month = 1;
				year++;
			}
		}
	}
	
	public void sub(int days) {
		//days必须是正数
		if(day < 0){
			System.out.println("days不合法" + days);
			return;
		}
		day -= days;
		while (day < 1) {
			month--;
			if(month <1) {
				month = 12;
				year--;
			}
			day += getDayOfMonth(year,month);
		}
	}
	
	public String toString() {
		return String.format("%04d-%02d-%02d", year, month, day);
	}
	
	//返回d1 和d2 之间相差的天数,
	//规定 d1 > d2
	public static int differ(Date d1, Date d2) {
		if(!(isGreatThan(d1, d2))) {
			System.out.println("d1 必须大于 d2");
			return -1;
		}
		
		int days = 0;
		Date tmp = new Date(d1);
		while (isGreatThan(tmp, d2)) {
			tmp.sub(1);
			days++;
		}
		
		return days;
	}
	//内部使用的方法,private
	
	//不会被修改的常量 DAY_OF_MONTH
	private static final int[] DAY_OF_MONTH = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	
	private static int getDayOfMonth(int year, int month) {
		int days = DAY_OF_MONTH[month - 1];
		if (month == 2 && isLeapYear(year)) {
			days = 29;
		}
		
		return days;
	}
	
	private static boolean isLeapYear(int year) {
		if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
			return true;
		}
		return false;
	}
	
	private static boolean isGreatThan(Date d1, Date d2) {
		if(d1.year > d2.year) {
			return true;
		}
		if(d1.year == d2.year && d1.month > d2.month) {
			return true;
		}
		if(d1.year == d2.year && d1.month == d2.month && d1.day > d2.day) {
			return true;
		}
		return false;
	}
	public static void main(String[] args) {
		Date date = new Date(2019,5,20);
		System.out.println(date.toString());
		date.add(10);
		System.out.println(date.toString());
		date.add(10);
		System.out.println(date.toString());
		date.sub(22);
		System.out.println(date.toString());
		
		Date today = new Date(2019, 5, 20);
		Date intern = new Date(2019, 12, 22);
		
		System.out.printf("距离12月1日还有 %d 天%n", Date.differ(intern,today));
		
	}
}

运行结果:

在这里插入图片描述

发布了91 篇原创文章 · 获赞 193 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_44057443/article/details/90697295