我目前正在使用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;
}
}
答案 0 :(得分:0)
我可以看到至少你的&#34;正常化&#34;方法无法正常工作。
想象一下你有d = 10,那么mm++; if(dd>31) dd-=31; else dd=0;
会导致d = 0。你会放松任何小于最大值的日子(这里是10)。那个月的天数。
答案 1 :(得分:0)
根据我的分析,您只从一方工作。您将输入数据作为给定格式并根据需要发布数据。但是,您还没有实现相反的顺序。您需要添加该功能,以便在您通过天数时,它将为您提供预期的结果。
希望您能通过添加该功能来解决它。