7-2 日期问题面向对象设计(聚合一) (35 分)

**

7-2 日期问题面向对象设计(聚合一) (35 分)

**
参考题目7-2的要求,设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1900,2050] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:
在这里插入图片描述
应用程序共测试三个功能:

求下n天
求前n天
求两个日期相差的天数
注意:严禁使用Java中提供的任何与日期相关的类与方法,并提交完整源码,包括主类及方法(已提供,不需修改)

解题报告
写完程序后,想要测试三个功能点的正确性,可以参考Java8中的LocalDateTime类中的相关方法(在提交代码中不允许使用): 例如:

LocalDateTime today = LocalDateTime.now();//定义对象 //LocalDateTime today
= LocalDateTime.of(2000,2,12);//定义对象 System.out.println(today.plusDays(10));//当前日期后十天
System.out.println(today.plusDays(-10));//当前日期前十天

注意,在使用Period求两个日期之间相差天数时,Period只能求同月日期的相差天数,因此要采用如下方法:

System.out.println(LocalDate.now().toEpochDay() -
LocalDate.now().minusDays(5).toEpochDay());

具体使用方法可参考Jdk1.8 API文档

输入格式:
有三种输入方式(以输入的第一个数字划分[1,3]):

1 year month day n //测试输入日期的下n天
2 year month day n //测试输入日期的前n天
3 year1 month1 day1 year2 month2 day2 //测试两个日期之间相差的天数

输出格式:

当输入有误时,输出格式如下: Wrong Format
当第一个数字为1且输入均有效,输出格式如下:
year-month-day
当第一个数字为2且输入均有效,输出格式如下:
year-month-day
当第一个数字为3且输入均有效,输出格式如下:
天数值

输入样例1:

3 2014 2 14 2020 6 14

输出样例1:
2312
输入样例2:

2 1935 2 17 125340

输出样例2:

1591-12-17

输入样例3:

1 1999 3 28 6543

输出样例3:

2017-2-24

输入样例4:

0 2000 5 12 30

输出样例4:

Wrong Format


import java.util.Scanner;

//Year类
class Year{
    int value;
    //默认构造方法
    public Year(){
    }
    //带参构造方法
    public Year(int value){
        this.value=value;
    }
    //getter
    public int getValue(){
        return value;
    }
    //setter
    public void setValue(int value){
        this.value=value;
    }
    //判断year是否为闰年
    public  boolean isLeapYear(){
        if((value%4==0&&value%100!=0)||value%400==0)
            return true;
        else
            return false;
    }
    //效验数据合法性
    public boolean validate(){
        if(value<=2050&&value>=1900)
            return true;
        else
            return false;
    }
    //年份加一
    public void yearIncrement(){
        value=value+1;
    }
    //年份减一
    public void yearReduction(){
        value=value-1;
    }
}
//Month类
class Month{
    int value;
    Year year;
    //默认构造方法
    public Month(){
    }
    //带参构造方法
    public Month(int yearValue,int monthValue){
        this.year=new Year(yearValue);
        this.value=monthValue;
    }
    //getter
    public int getValue(){
        return value;
    }
    public Year getYear(){
        return year;
    }
    //setter
    public void setValue(int value){
        this.value=value;
    }
    public void setYear(Year year){
        this.year=year;
    }
    //日期复位(1)
    public void resetMin(){
        value=1;
    }
    //月份设置为12
    public void resetMax(){
        value=12;
    }
    //效验数据合法性
    public boolean validate(){
        if(value>=1&&value<=12)
            return true;
        else
            return false;
    }
    //月份加一
    public void dayIncrement(){
        value=value+1;
    }
    //月份减一
    public void dayReduction(){
        value=value-1;
    }
}
//Day类
class Day{
    int value;
    Month month;
    int a[]={31,28,31,30,31,30,31,31,30,31,30,31};
    //默认构造方法
    public Day(){
    }
    //带参构造方法
    public Day(int yearValue,int monthValue,int dayValue){
        this.month=new Month(yearValue,monthValue);
        this.value=dayValue;
    }
    //getter
    public int getValue(){
        return value;
    }
    public Month getMonth(){
        return month;
    }
    //setter
    public void setValue(int value){
        this.value=value;
    }
    public void setMonth(Month value){
        this.month=value;
    }
    //日期复位(1)
    public void resetMin(){
        value=1;
    }
    //日期设为该月最大值
    public void resetMax(){
        value=a[month.getValue()-1];
    }
    //效验数据合法性
    public boolean validate(){
        if(this.getMonth().getYear().isLeapYear())
            a[1]=29;
        if(value>=1&&value<=a[month.getValue()-1])
            return true;
        else
            return false;
    }
    //日期加一
    public void dayIncrement() {
        value=value+1;
    }
    //日期减一
    public void dayReduction() {
        value=value-1;
    }
}
//DateUtil类
class DateUtil{
    Day day;
    //默认构造方法
    public DateUtil(){
    }
    //带参构造方法
    public DateUtil(int d,int m,int y){
        this.day=new Day(d,m,y);
    }
    //getter
    public Day getDay(){
        return day;
    }
    //setter
    public void setDay(Day d){
        this.day=d;
    }

    //效验数据合法性
    public boolean checkInputValidity(){
        if(this.getDay().getMonth().getYear().validate()&&this.getDay().getMonth().validate()&&day.validate())
            return true;
        else
            return false;
    }
    //比较两个日期大小
    public boolean compareDates(DateUtil date) {
        if(date.getDay().getMonth().getYear().getValue()<this.getDay().getMonth().getYear().getValue())
            return false;
        else if(date.getDay().getMonth().getYear().getValue()==this.getDay().getMonth().getYear().getValue()&&date.getDay().getMonth().getValue()<this.getDay().getMonth().getValue())
            return false;
        else if(date.getDay().getMonth().getYear().getValue()==this.getDay().getMonth().getYear().getValue()&&date.getDay().getMonth().getValue()==this.getDay().getMonth().getValue()&&date.getDay().getValue()<this.getDay().getValue())
            return false;
        else
            return true;
    }
    //判定两个日期是否相等
    public boolean equalTwoDates(DateUtil date){
        if(this.getDay().getValue()==date.getDay().getValue()&&this.getDay().getMonth().getValue()==date.getDay().getMonth().getValue()&& this.getDay().getMonth().getYear().getValue()==date.getDay().getMonth().getYear().getValue())
            return true;
        else
            return false;
    }
    //日期值格式化
    public String showDate(){
        return this.getDay().getMonth().getYear().getValue()+"-"+this.getDay().getMonth().getValue()+"-"+this.getDay().getValue();
    }
    //计算该年的剩余天数
    public int syts(DateUtil d){
        int a[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
        int b=0,i;
        for(i=d.getDay().getMonth().getValue()+1;i<=12;i++){
            b=b+a[i];
        }
        b=b+a[d.getDay().getMonth().getValue()]-d.getDay().getValue();
        if(d.getDay().getMonth().getYear().isLeapYear()&&d.getDay().getMonth().getValue()<=2)//闰年
            b++;
        return b;
    }

    //求下n天
    public DateUtil getNextNDays(int n){
        int a[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
        int y=0,m=0,d=0;
        int i,j;
        int b=syts(this);//该年剩余天数
        if(b>n){//该年剩余天数大于n
            y=this.getDay().getMonth().getYear().getValue();
            if(this.getDay().getMonth().getYear().isLeapYear()){//如果是闰年
                a[2]=29;
            }
            int e=a[this.getDay().getMonth().getValue()];//该月的天数
            e=e-this.getDay().getValue();//本月剩余的天数
            if(e>=n){//如果n天后在本月
                m=this.getDay().getMonth().getValue();
                d=n+this.getDay().getValue();
            }
            else{//如果n天后不在本月
                n=n-e;
                m=this.getDay().getMonth().getValue()+1;
                i=m;
                while(n-a[i]>0&&i<=12){//找到月
                    n=n-a[i];
                    m++;
                    i++;
                }
                d=n;//找到天
            }
        }
        else{//该年剩余天数小于n
            n=n-b;
            y=this.getDay().getMonth().getYear().getValue()+1;
            int c=365;//平年天数
            if(new Year(y).isLeapYear()){//闰年天数
                c++;
            }
            while(n-c>0){//找到年
                n=n-c;
                y++;
                c=365;
                if(new Year(y).isLeapYear())
                    c++;
            }
            i=1;
            while(n-a[i]>0&&i<=12){//找到月
                n=n-a[i];
                i++;
            }
            m=i;
            d=n;//找到天
        }
        return new DateUtil(y, m, d);
    }
    //求前n天
    public DateUtil getPreviousNDays(int n){
        int a[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
        int y=0,m=0,d=0;
        int i,b;
        b=365-syts(this);//该日期所在年份已经过的天数
        if(this.getDay().getMonth().getYear().isLeapYear()){//如果是闰年
           b++;
        }
        if (b>n){//如果前n天在该年
            y=this.getDay().getMonth().getYear().getValue();
            int e=this.getDay().getValue();//本月已经过的天数
            if(e>n){//如果前n天在本月
                m=this.getDay().getMonth().getValue();
                d=e-n;
            }
            else{//如果前n天不在本月
                n=n-e;
                m=this.getDay().getMonth().getValue()-1;
                i=m;
                while(n-a[i]>0&&i>=0){//找到月
                    n=n-a[i];
                    m--;
                    i--;
                }
                d=a[i]-n;//找到天
                if(new Year(y).isLeapYear()&&m==2){
                    d++;
                }
            }
        }
        else{//如果前n天不在该年
            n=n-b;
            y=this.getDay().getMonth().getYear().getValue()-1;
            int f=365;
            if(new Year(y).isLeapYear()){
                f++;
            }
            while(n-f>0){//找到年
                n=n-f;
                y--;
                f=365;
                if(new Year(y).isLeapYear())
                    f++;
            }
            i=12;
            while(n-a[i]>0&&i>=0){//找到月
                n=n-a[i];
                i--;
            }
            m=i;
            d=a[i]-n;//找到天
            if(new Year(f).isLeapYear()&&m==2){
                d++;
            }
        }
        return new DateUtil(y, m, d);
    }
    //求两个日期之间的天数
    public int getDaysofDates(DateUtil date){
        DateUtil b1=this;
        DateUtil b2=date;
        if(this.equalTwoDates(date)){//如果两天的日期相等
            return 0;
        }
        else if(!this.compareDates(date)){//如果日期大小不对
            b1=date;
            b2=this;
        }
        int a[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
        int i,j,ts=0;
        for(i=b1.getDay().getMonth().getYear().getValue()+1;i<b2.getDay().getMonth().getYear().getValue();i++){//两个日期的年数之和
            ts=ts+365;
            if(new Year(i).isLeapYear())
                ts++;
        }
        if(b1.getDay().getMonth().getYear().getValue()==b2.getDay().getMonth().getYear().getValue()&&b1.getDay().getMonth().getValue()==b2.getDay().getMonth().getValue()){//年份相同,月份相同,日不同
            ts=b2.getDay().getValue()-b1.getDay().getValue();
        }
        else if(b1.getDay().getMonth().getYear().getValue()==b2.getDay().getMonth().getYear().getValue()&&b1.getDay().getMonth().getValue()!=b2.getDay().getMonth().getValue()){//年份相同,月份不同
            if(b1.getDay().getMonth().getYear().isLeapYear())//是闰年
                a[2]=29;
            ts=ts+a[b1.getDay().getMonth().getValue()]-b1.getDay().getValue();//小日期该月剩余的天数
            ts=ts+b2.getDay().getValue();//大日期的天数
            for(j=b1.getDay().getMonth().getValue()+1;j<=b2.getDay().getMonth().getValue()-1;j++)//月份天数和
                ts+=a[j];
        }
        else if(b1.getDay().getMonth().getYear().getValue()!=b2.getDay().getMonth().getYear().getValue()){//年份不同
            ts=ts+a[b1.getDay().getMonth().getValue()]-b1.getDay().getValue();//小日期在该月剩余的天数
            ts=ts+b2.getDay().getValue();//大日期在该月已经过的天数
            for(j=b1.getDay().getMonth().getValue()+1;j<=12;j++)//小日期在该年剩余的天数
                ts=ts+a[j];
            for(j=b2.getDay().getMonth().getValue()-1;j>0;j--)//大日期在该年已经过的天数
                ts=ts+a[j];
            if(b1.getDay().getMonth().getYear().isLeapYear()&&b1.getDay().getMonth().getValue()<=2)//如果小日期该年为闰年且该天在1月或2月
                ts++;
            if(b2.getDay().getMonth().getYear().isLeapYear()&&b2.getDay().getMonth().getValue()>2)//如果大日期该年为闰年且该天在1月或2月后
                ts++;
        }
        return ts;
    }
}
//主类
public class Main {
    public static void main(String[] args) {
        Scanner x=new Scanner(System.in);
        int year=0,month=0,day=0,a,b;
        a=x.nextInt();//输入判断类型
        year=x.nextInt();month= x.nextInt();day=x.nextInt();//输入年月日
        DateUtil c=new DateUtil(year,month,day);
        if(a==1){//求下n天
            b=x.nextInt();//输入n
            if(!c.checkInputValidity()||b<0){//如果数据不合法
                System.out.println("Wrong Format");
                System.exit(0);
            }
            else
                System.out.println(c.getNextNDays(b).showDate());
        }
        else if(a==2){
            b=x.nextInt();//输入n
            if(!c.checkInputValidity()||b<0){//如果数据不合法
                System.out.println("Wrong Format");
                System.exit(0);
            }
            else
                System.out.println(c.getPreviousNDays(b).showDate());
        }
        else if(a==3){
            int y1,m1,d1;
            y1=x.nextInt();m1= x.nextInt();d1=x.nextInt();//输入第二个年月日
            DateUtil d=new DateUtil(y1,m1,d1);
            if(!c.checkInputValidity()||!d.checkInputValidity()){//如果数据不合法
                System.out.println("Wrong Format");
                System.exit(0);
            }
            else
                System.out.println(c.getDaysofDates(d));
        }
        else
            System.out.println("Wrong Format");

    }
}


  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
面向数据结构的开发方法(Data-Driven Design,DDD)是一种以数据为中心的软件开发方法,旨在实现更清晰、更可维护的代码,同时提高软件开发效率和代码质量。以下是详细介绍: 1. 定义领域模型:领域模型是指将领域中的对象、行为和关系转化为代码实现的过程。在DDD中,领域模型是由业务规则和领域对象组成的,需要深入了解业务需求,通过分析业务场景,抽象出领域模型的各种元素。 2. 明确职责边界:DDD中,每个领域对象都有其特定的职责边界,即对外可见的行为和数据。在设计时,需要明确每个对象所拥有的职责,并将其封装起来,以保证对象的职责不会被其他对象侵犯。 3. 使用值对象:值对象是指不可变的对象,其状态不可修改。在DDD中,值对象用于表示领域中的某个概念,例如日期、时间、金额等。使用值对象可以减少错误和异常,提高代码的可读性和可维护性。 4. 使用聚合根:聚合根是一组相关的对象的根对象,用于保证对象之间的一致性和完整性。在DDD中,聚合根负责管理聚合内部的对象,并对外提供访问聚合内部对象的接口。 5. 实现领域服务:领域服务是指对领域内部的某些操作进行封装,以提高代码复用性和可维护性。在DDD中,领域服务通常用于实现复杂的业务逻辑,例如交易、计费等。 6. 使用领域事件:领域事件是指在领域内部发生的某些事情,可以被其他对象监听并做出相应的反应。在DDD中,领域事件用于解耦对象之间的关系,提高系统的可扩展性和灵活性。 总之,面向数据结构的开发方法注重以数据为中心的设计思路,将领域模型转化为代码实现,并通过职责边界、值对象聚合根、领域服务、领域事件等手段来提高代码的可读性、可维护性和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值