创建一个能够计算日期的类,输入天数和当前时间可以计算出之后或之前的日期,并且能够计算两个具体时间之间的天数

  1. 问题描述
    这个问题主要是熟练使用类,练习类的有关知识点,理解构造方法在类中的作用,学会 调用对象的方法和属性,理解this关键字的作用。
    2.问题分析
    要完成天数的计算,首先得要规定年份,月份,天数的范围,年可以根据实际情况去规定,每年有12月份,每个月有不同的天数,这里可以把每个月份的天数按照顺序使用一个数组保存起来,使用下标直接访问。但是在判断天数里有一个特殊情况就是二月份的天数在闰年是29天,在非闰年是28天,这里还得判断是否是闰年。接下来就是之后天数和之前天数的计算,这里一个月一个月来计算,当天数大于每个月的天数时 ,月份加一,再减去这个月份的天数,当月份大于12的时候,就说明这个时候成为一月,相应的年份也应该加一。而计算之前日期的时候则相反,判断的条件变为小于零。
public class Date {
	private  int year;
	private   int month;
	private   int day;
	private  static int[] dayOfMonth={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	public Date()
	{
		int year=0;
		int month=0;
		int day=0;
	}
	public   Date(int year,int month,int day)
	{
		if(year<1880||year>2020)
		{
			System.err.println("年份输入有误");
			return;
		}
		if(month<1||month>12)
		{
			System.err.println("月份输入有误");
			return;
		}
		if(day<1||day>judgeDayOfMonth(year,month))
		{
			System.err.println("天数输入有误");
			return;
		}
		this.year=year;
		this.month=month;
		this.day=day;
		
	
}
	public   int judgeDayOfMonth(int year, int month) {
		if (month != 2) {
			return dayOfMonth[month - 1];
		}
		
		if (isLeapYear(year))
		{
			return 29;
		} 
		else
		
			return 28;
		
		
	}
	
	
	public static boolean isLeapYear(int year)
	{
		
		if(year%4==0&&year%100!=0||year%400==0)
		{
			return true;
		}
		else
		{
		  return false;	
		}
		
	}
//	public Date dateAfter(int day1)
//	{
//		day+=day1;
//		while(day>judgeDayOfMonth( year, month))
//		{
//			day=day-judgeDayOfMonth( year, month);
//			month+=1;
//			if(month>12)
//			{
//				month=1;
//				year=year+1;
//			}
//		}
//		return this;
//	}
	public Date dateAfter(int days) {
		Date t=new Date(year,month,day);
		 t.day += days;
		
		while (t.day > judgeDayOfMonth(year, month)) {
			t.day -= judgeDayOfMonth(year, month);
			t.month += 1;
			
			if (t.month > 12) {
				t.month = 1;
				t.year += 1;
			}
		}
		
		return t;
	}
//	public Date dateBefore(int day1)
//	{
//		day-=day1;
//		while(day<0)
//		{
//			day=day+judgeDayOfMonth( year, month);
//			month=month-1;
//			if(month<1)
//			{
//				month=month+12;
//				year=year-1;
//			}
//		}
//		return this;
//	}
	public Date dateBefore(int days) {
		Date t=new Date(year,month,day);
		
		
		t.day-=days;
		while (t.day <0) {
			t.day += judgeDayOfMonth(year, month);
			t.month -= 1;
			
			if(t.month<1)
			{
				t.month=12;
				t.year-=1;
			}
			
	}
		return t;
	}
	public   int dayOfYear(int year)
	{
		if(isLeapYear(year))
		{
			return 366;
		}
		else
		{
			return 365;
		}
	}
	public   int diff(Date a, Date c) {
		Date b=new Date (year,month,day);
		int n1=(a.year)*(a.dayOfYear(year))+(a.month)*(a.judgeDayOfMonth(year,month))+(a.day);
		int n2=(b.year)*(b.dayOfYear(year))+(b.month)*(b.judgeDayOfMonth(year,month))+(b.day);
		int days=n2-n1;
		return days;
	
	}
	public String toString() {
		return String.format("%04d-%02d-%02d", year, month, day);
	}
	
	public static void main(String[] args) {
		Date d = new Date(2019,7,20);
		Date d2=new Date(2019,7,22);
		System.out.println(d2.toString());
		int n=d2.diff(d,d2);
		System.out.println(n);
		System.out.println(d2.toString());
		
//		Date r = d.dateAfter(731);
//        Date  f=d1.dateBefore(1000);
//		System.out.println(r.toString());
//		System.out.println(f.toString());
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值