软件构造Lab3中关于时间相关类的设计

Posted 匿名甩尸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软件构造Lab3中关于时间相关类的设计相关的知识,希望对你有一定的参考价值。

在lab3中,不同的应用需要的时间格式不同,但IntervalSet接口统一采用了long类型作为时间点参数。为了能够使用IntervalSet接口,初步考虑使用一个时间类进行统一的转换。本来采用了Java自带的Date数据类型作为转换头,但由于Date中大部分的方法已经被舍弃了,无法作为解码器使用;除此之外,由于从给定日期到1900年1月1日的毫秒数过大,在课表APP中担心爆long,因此需要重新设计APP。最终人为定义了一个编解码器类,每个APP需要时调用作为编解码器将时间与long进行转换。排班与课表APP采用从1900年1月1日到给定时间的天数作为编码结果,保证了编码的连续性;其中课表可以将天数乘10转换为课时数,并且也保证了连续。

class DutyCodec
{
	public DutyCodec() {}
	
	/**
	 * Encode a date to a long integer
	 * @param year the year of the date
	 * @param month the month of the date
	 * @param day the day of the date
	 * @return a long integer indicates the code of the date
	 */
	public long encode(int year, int month, int day) throws DateError
	{
		long code = day - 1;
		
		if(year < 1900 || month <= 0 || day <= 0 || month > 12 || day > 31)
			throw new DateError("Invalid date");
		if(day == 31)
			if(month == 2 || month == 4 || month == 6 || month == 9 || month == 11)
				throw new DateError("Invalid date");
		if(month == 2 && day == 29)
			if(!(year % 4 == 0 && year % 100 != 0))
				throw new DateError("Invalid date");
		
		for(int i = 1900; i < year; i++)
		{
			if((i % 4 == 0 && i % 100 != 0) || i % 400 == 0)
				code += 366;
			else
				code += 365;
		}
		for(int i = 1; i < month; i++)
		{
			if(!(i == 2 || i == 4 || i == 6 || i == 9 || i == 11))
				code += 31;
			else if(i != 2)
				code += 30;
			else
				code += ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0) ? 29 : 28;
		}
		
		return code;
	}
	
	/**
	 * Get the year from the code
	 * @param code the code want to decode
	 * @return a integer indicates the year
	 */
	public int getYear(long code)
	{
		int year = 0;
		for(year = 1900; code >= 0; year++)
		{
			if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
				code -= 366;
			else
				code -= 365;
		}
		
		return year - 1;
	}
	
	/**
	 * Get the month from the code
	 * @param code the code want to decode
	 * @return a integer indicates the month
	 */
	public int getMonth(long code)
	{
		int year = 0;
		int month = 0;
		for(year = 1900; code >= 0; year++)
		{
			if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
				code -= 366;
			else
				code -= 365;
		}
		year--;
		code += ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) ? 366 : 365;
		
		for(month = 1; code >= 0; month++)
		{
			if(!(month == 2 || month == 4 || month == 6 || month == 9 || month == 11))
				code -= 31;
			else if(month != 2)
				code -= 30;
			else
				code -= ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) ? 29 : 28;
		}
		
		return month - 1;
	}
	
	/**
	 * Get the day from the code
	 * @param code the code want to decode
	 * @return a integer indicates the day
	 */
	public int getDay(long code)
	{
		int year = 0;
		int month = 0;
		for(year = 1900; code >= 0; year++)
		{
			if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
				code -= 366;
			else
				code -= 365;
		}
		year--;
		code += ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) ? 366 : 365;
		
		for(month = 1; code >= 0; month++)
		{
			if(!(month == 2 || month == 4 || month == 6 || month == 9 || month == 11))
				code -= 31;
			else if(month != 2)
				code -= 30;
			else
				code -= ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) ? 29 : 28;
		}
		month--;
		if(!(month == 2 || month == 4 || month == 6 || month == 9 || month == 11))
			code += 31;
		else if(month != 2)
			code += 30;
		else
			code += ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) ? 29 : 28;
		
		return (int) code + 1;
	}
}

以上是关于软件构造Lab3中关于时间相关类的设计的主要内容,如果未能解决你的问题,请参考以下文章

软件构造Lab3中关于时间相关类的设计

软件构造Lab3基本流程指导及重难点分析

java中关于对象初始化的问题

Unity中关于AnimationEvent.Time的问题

java中关于矩形类

这个嵌套类构造函数片段可以应用于泛型类吗?