这次我们要做一个日期类Date类
主要目的是 1. 熟悉-->构造不同参数的函数 2.善于利用已有的函数!!
题目要求:
Date类要求
可设定年月日
可转换为字符串,并可指定分隔符,默认为’-’
可获取若干天以前/后的日期
可计算与某个日期相隔的天数,日期的形式可能是日期对象,也可能是代表年月日的三个整数
可与某个日期比较大小,日期的形式同上
可计算星期几
解题思路:
1.设置类的变量,并创建构造函数。
2.创建 日期转换字符串函数, 分别创建带参数,和不带参数的函数
3.计算若干天以前/后的日期,先把日期转换为天数,进行加减,在吧天数转换为日期
4.计算某个提起相隔的天数,可以把日期转换为天数,加减判断。 日期形式两种,这里就需要,多个构造函数(根据要求设置参数)
5.比较日期大小, 转化为天数比较
6.计算星期几, 天数%7的余数,就是星期数 。我们发现周日为0,这个时候就需要(天数-1)%7 +1 ,这样就避免了上述情况
java自身有Date函数,不过这次我们要自己创建。JAVA中的月份,星期几的表示方式有产别 (正常表示-1,因为是从0开始)
程序代码:
public class Date {
public int year;
public int month;
public int day;
public static String splitChar = "_"; /**
* 比较两个日期大小
* @param date 拿来比较的日期
* @return 0-等于 1-大于 -1-小于
*/
public byte compare(Date date) {
int n = off(date);
// 第一种判断方法
/*if (0==n){
return 0;
}
if(n > 0){
return 1;
}
return -1;*/ //第二种判断方法
return (byte)(0 == n?0:(n>0?1:-1));
} /**
* 计算与某个日期相隔的天数
* @param year 年 20xx形式
* @param month 月
* @param day 日
* @return 相隔的天数
*/
public int off(int year, int month, int day) {
Date date = new Date(year,month,day);
return off(date);
} /**
* 计算与某个日期相隔的天数
* @param date 相隔的日期 20xx-xx-xx形式
* @return 相隔的天数
*/
public int off(Date date) {
return this.getDays()-date.getDays();
} /**
* 获取若干天以前的日期
* @param days 天数
* @return 改变后的日期
*/
public Date before(int days) {
int n = this.getDays() - days; return new Date(n);
} /**
* 获取若干天以后的日期
* @param days 天数
* @return 改变后的日期
*/
public Date after(int days) {
int n = this.getDays() + days; return new Date(n);
} /**
* 计算当前日期为周几?
* @return 星期几
*/
public int weekday() {
int days = getDays();
return (byte)((days-1)%7+1);
} /**
* 将日期转换为字符
* @return 日期字符串形式 2014-12-08
*/
public String toStr() {
return toStr("-");
} /**
* 将日期转换为字符串
* @param splitChar 分割字符
* @return 日期字符串
*/
public String toStr(String splitChar) {
return String.format("%d%s%d%s%d",this.year,splitChar,this.month,splitChar,this.day);
} /**
* 构造函数
* @param year 年
* @param month 月
* @param day 日
*/
public Date(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
} /**
* 计算当前日期是历史上的第几天
* @return 天数
*/
public int getDays(){
int sum = day;
int monthday;
switch (month - 1 ){
case 12 :
monthday = 30;
sum += monthday;
case 11:
monthday = 30;
sum += monthday;
case 10:
monthday = 31;
sum += monthday;
case 9:
monthday = 30;
sum += monthday;
case 8:
monthday = 31;
sum += monthday;
case 7:
monthday = 31;
sum += monthday;
case 6:
monthday = 30;
sum += monthday;
case 5:
monthday = 31;
sum += monthday;
case 4:
monthday = 30;
sum += monthday;
case 3:
monthday = 31;
sum += monthday;
case 2:
monthday = isLeap(year)?29:28;
sum += monthday;
case 1:
monthday = 31;
sum += monthday;
} for (int year = this.year-1;year>=1;year-- ){
sum += isLeap(year)?366:365;
}
return sum;
} /**
* 构造函数
* @param days 天数
*/
public Date(int days){
/*
思路:
1.确定年份,逐年减去该年的天数,直到不够减
2.确定月份,逐月减去该月的天数,直到不够减
3.剩下的天数即为日
*/
year = 1;
while (true){
int n = isLeap(year)?366:365; //该年的天数
if(days < n){
break;
}
days -= n;
year++;
} int []mon = {31,28,31,30,31,30,31,31,30,31,30,31};
for (month=1;month<=12;month++){
// 该月的天数
int monthDay = mon[month-1];
if (2==month&&isLeap(year)){
monthDay ++;
}
if(days<monthDay){
break;
}
days -= monthDay;
}
day = days;
} /**
* 判断闰年
* @param year
* @return true-闰年 false-平年
*/
public boolean isLeap(int year){
return year%400==0||(year%4==0&&year%100!=0);
} }
测试类Test
public class Test {
public static void main(String[] args) { Date date1 = new Date(2016,11,2); //设置日期1 2016-11-2
Date date2 = new Date(2017, 3,12); // 设置日期2 2017-3-12 System.out.printf("%s是星期%d\n",date1.toStr(),date1.weekday()); // 计算日期1是星期几
System.out.printf("%s是星期%d\n",date2.toStr(Date.splitChar),date2.weekday()); //计算日期2是星期几
//转换为字符串,指定分隔符 Date date3 = date1.after(50); // 日期3为, 日期1后50天
Date date4 = date1.before(50); // 日期4为, 日期2前50天 int off1 = date3.off(date4); // 计算日期3 和 日期4相差多少天
System.out.printf("%s和%s相隔%d天\n",date3.toStr(),date4.toStr(),off1); int off2 = date3.off(2017,2,21); // 计算日期3 和 2017-2-21 相差多少天
System.out.printf("%s和2017-02-21相隔%d天\n",date3.toStr(),off2); byte result = date3.compare(date4); // 比较日期3 和 日期4 的大小关系
String relation = "";
switch (result){
case 0: relation = "等于" ; break;
case 1: relation = "大于" ; break;
case -1: relation = "小于" ; break;
}
System.out.printf("%s%s%s\n",date3.toStr(),relation,date4.toStr()); Date d = new Date(800); 计算公元第800天,是什么日期
System.out.println("今天是:"+d.toStr()); System.out.printf("今天是公元的第%d天\n",date3.getDays()); //输出日期3是公元的第几天
}
}
运行结果:
心得体会:
我们要善于运用 带参函数,这样同样功能的函数带不同参数时,解决不同的问题。
比如说计算两个日期多少天 1你可以参数设置为日期,直接与日期进行比较 2.你可以设置为具体的年月日,进行比较。
使用时很方便。