构建类Date,将日期转换为天数,或将天数转换为有效日期

时间:2014-03-19 10:24:29

标签: java

我目前正在使用Java进行培训,并且我创建了一个具有多种方法的类Date,我遇到问题的那些(算法不对我猜)是验证日期,将天数转换为日期或一天的日期(如下面的代码所示)。

我很乐意对此有所了解。 当我编译main时,它包含我转换为days的日期,然后重新转换为有效日期,问题是它会以不同的形式返回。所以欢迎任何想法或建议。

这是代码 (现在工作得很好,(直到现在),经过多次试验和错误修复后,所以这是包含工作代码的最终编辑)

//Main
package Classes;

public class Main {

    public static void main(String[] args) {
        Date d1=new Date(30,12,30,12,2005);
        d1.normalize();
        System.out.print(d1);
        int i=d1.dateToDays();
        System.out.println(" has "+i+" days");
        Date d2=new Date(0,0,i,1,1);
        System.out.println(i+" is the number of days equivalent to "+d2);

    }

}

//Class : Date
package Classes;

public class Date {
        private int min;
        private int hh;
        private int dd;
        private int mm;
        private int yyyy;

        public Date(int min, int hh, int dd, int mm, int yyyy) {
            super();

                this.min = min;
                this.hh = hh;
                this.dd = dd;
                this.mm = mm;
                this.yyyy = yyyy;
                if(verify()==false) normalize();
        }   
        @Override
        public String toString() {
            return "Date [min=" + min + ", hh=" + hh + ", dd=" + dd + ", mm="
                    + mm + ", yyyy=" + yyyy + "]";
        }
        //Method isBefore returns true if actual date is before the one passed as argument
        public boolean isBefore(Date d){
            if(yyyy<d.yyyy)
            {

                return true;
            }
            else if(yyyy==d.yyyy)
            {
                if(mm<d.mm)
                {

                    return true;
                }
                else if(mm==d.mm)
                {
                    if(dd<d.dd)
                    {

                        return true;
                    }
                    else if(hh==d.hh)
                    {
                        if(min<d.min)
                        {

                            return true;
                        }
                        else
                        {
                            return false;
                        }
                    }
                }
            }
            else
            {
                return false;   
            }
            return false;
        }
        //Method isAfter returns true if actual date is after the one passed as argument
        public boolean isAfter(Date d){
            if(isBefore(d)==false && this.identicalTo(d)==false)
            {
                return true;
            }
            return false;
        }
        //Method identicalTo returns true if actual date is identical to the one passed as argument
        public boolean identicalTo(Date d){
            if(yyyy==d.yyyy&&mm==d.mm&&dd==d.dd&&hh==d.hh&&min==d.min) return true;
            return false;
        }
        //Method sameDayAs
        public boolean sameDayAs(Date d){
            if(yyyy==d.yyyy&&mm==d.mm&&dd==d.dd) return true;
            return false;
        }
        //Method isLeap, determines if current year it's a leap year (true) or not (false)
        public boolean isLeap() 
        {
            if((yyyy%4==0&&yyyy%100!=0)||yyyy%400==0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        //Method monthType() returns 1 if month has 31 days, 2 if month has 30 days, 3 if month has 28 days, 4 if month has 29 days
        public int monthType(){
            if(mm==1||mm==3||mm==5||mm==7||mm==8||mm==10||mm==12) //For months that contain 31 days
            {
                return 1;
            }
            else if(mm==4||mm==6||mm==9||mm==11) //For months that contain 30 days
            {
                return 2;
            }
            else if(mm==2)
            {
                if(isLeap()==false)//If current year isn't a leap year
                {
                    return 3;//For when Fabruary contains 28 days
                }
                else
                {
                    return 4;//For when Fabruary contains 28 days
                }
            }
            return  0; 
        }
        //Method verify, verifies if the current date is a valid one.
        public boolean verify(){
            if(yyyy>0)
            {
                if(mm<13 && mm>0)
                {
                    if(monthType()==1      && (dd<=31 && dd>=1))
                    {
                        return true;
                    }
                    else if(monthType()==2 && (dd<=30 && dd>=1))
                    {
                        return true;
                    }
                    else if(monthType()==3 && (dd<=28 && dd>=1))
                    {
                        return true;
                    }
                    else if(monthType()==4 && (dd<=29 && dd>=1))
                    {
                        return true;
                    }
                    else return false;
                }
                return false;
            }
            return false;

        }
        //Method normalize, Converts a number of days into a dd mm yyyy valid date.
        public void normalize()
        {

            while(verify()==false)
                {
                    if(monthType()==1)
                    {

                        if(dd>31) {
                            dd-=31;
                            mm++;
                        }
                    }
                    else if(monthType()==2)
                    {
                        if(dd>30) {
                            dd-=30;
                            mm++;
                        }
                    }
                    else if(monthType()==3)
                    {
                        if(dd>28) {
                            dd-=28;
                            mm++;
                        }
                    }
                    else if(monthType()==4)
                    {
                        if(dd>29) {
                            dd-=29;
                            mm++;
                        }
                    }

                    if(mm>12)
                    {
                        int temp_yyyy=0;
                        temp_yyyy=mm/12;
                        yyyy+=temp_yyyy;
                        mm%=12;
                    }
                }

        }
        //Converts a valid day into a number of days 
        public int dateToDays(){
            int days=0;

            days+=dd;
            dd=1;
            while(yyyy>1)
            {   
                if(isLeap())
                {
                    days+=366;
                    yyyy--;
                }
                else
                {
                    days+=365;
                    yyyy--;
                }   
            }
            yyyy--;//Because the constructor begins with 1, so the date would have 1 more year than the one equivalent to the number of days entered
            //This first if else if block is used as a first iteration before the while loop that only deals with dd as 31 30 28 or 29 (but not bellow)
            if(monthType()==1){
                days+=(31-dd);
                mm--;
            }
            else if(monthType()==2){
                days+=(30-dd);
                mm--;
            }
            else if(monthType()==3){
                days+=(28-dd);
                mm--;
            }
            else if(monthType()==4){
                days+=(29-dd);
                mm--;
            }
            mm--;//Because the constructor begins with 1, so the date would have 1 more month than the one equivalent to the number of days entered
            while(mm>1)
            {
                if(monthType()==1){
                    days+=31;
                    mm--;
                }
                else if(monthType()==2){
                    days+=30;
                    mm--;
                }
                else if(monthType()==3){
                    days+=28;
                    mm--;
                }
                else if(monthType()==4){
                    days+=29;
                    mm--;
                }
            }
            return days;
        }
}

2 个答案:

答案 0 :(得分:0)

我可以看到至少你的&#34;正常化&#34;方法无法正常工作。 想象一下你有d = 10,那么mm++; if(dd>31) dd-=31; else dd=0;会导致d = 0。你会放松任何小于最大值的日子(这里是10)。那个月的天数。

答案 1 :(得分:0)

根据我的分析,您只从一方工作。您将输入数据作为给定格式并根据需要发布数据。但是,您还没有实现相反的顺序。您需要添加该功能,以便在您通过天数时,它将为您提供预期的结果。

希望您能通过添加该功能来解决它​​。