我正在用Java编写一个程序,它基本上可以找到两个特定日期之间的天数。用户以DD / MM / YYYY格式输入两个日期,我取日/月/年的子字符串并计算2之间的天数。我还做了一种验证,如果格式错误的话(例如d / mm / yyyy)然后该人必须以正确的格式重写日期。我这样做是为了确保日期中的/处于正确的位置。如果4 /匹配,那么布尔变量给出我的真实,并且程序继续,如果不是它给我假,它再次询问日期。
问题在于它总是给我错误,即便如此,它也不会重新循环。
import java.util.*;
public class DateDifference {
int day1, day2, month1, month2, year1, year2;
String startdate, enddate, day1S, day2S, month1S, month2S, year1S, year2S;
String datevalidation = "/";
boolean dval;
public static void main(String args[]){
DateDifference difference = new DateDifference();
}
DateDifference() {
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
Scanner sc = new Scanner (System.in);
do {
System.out.println("Enter Start Date [dd/mm/yyyy]:");
startdate = sc.next();
System.out.println("Enter End Date [dd/mm/yyyy]:");
enddate = sc.next();
int l1 = startdate.length();
int l2 = enddate.length();
day1S = startdate.substring(0,2);
month1S = startdate.substring(3,5);
year1S = startdate.substring(6,l1);
day2S = enddate.substring(0,2);
month2S = enddate.substring(3,5);
year2S = enddate.substring(6,l2);
if (startdate.substring(2,3).equals(datevalidation) & startdate.substring(5,6).equals(datevalidation) & enddate.substring(2,3).equals(datevalidation) & enddate.substring(5,6).equals(datevalidation))
dval = true;
else
dval = false;
System.out.println("Wrong date format. Try again");
} while (dval = false);
day1 = Integer.parseInt(day1S);
month1 = Integer.parseInt(month1S);
year1 = Integer.parseInt(year1S);
day2 = Integer.parseInt(day2S);
month2 = Integer.parseInt(month2S);
year2 = Integer.parseInt(year2S);
cal1.set(year1, month1 - 1, day1);
cal2.set(year2, month2 - 1,day2);
System.out.println("Days= "+daysBetween(cal1.getTime(),cal2.getTime()));
}
public int daysBetween(Date cal1, Date cal2){
return (int)( (cal2.getTime() - cal1.getTime()) / (1000 * 60 * 60 * 24));
}
}
以下是一些有关其工作原理的图片:
输入正确时: http://vvcap.net/db/2100RYdaSM1T6EXLqgq5.png
输入不正确时: http://vvcap.net/db/9qSEwDKSTIdLAWmxS_Cy.png
如果不正确,当它试图在一个整数中产生1 /时,它就会卡住,这是我能理解的。
任何帮助?
非常感谢。
答案 0 :(得分:0)
根据我所看到的,你的问题是你在约会substring()
时的问题。您正在检查位置是否等于“/”但是您正在占据2个位置(因此错误显示您要转换为的字符串和int是错误代码中的“1 /”。
尝试更改所有If语句行如下所示:
这
if (startdate.substring(2,3).equals(datevalidation) & startdate.substr...
dval = true;
...
要
if ( !startdate.substring(2,3).contains(datevalidation) &
!startdate.substring(5,6).contains(datevalidation) &
!enddate.substring(2,3).contains(datevalidation) &
!enddate.substring(5,6).contains(datevalidation))
dval = true;
...
并且while()
语句应为==
而不仅仅是=
。你设置它而不是检查循环的每次迭代。
而不是检查2个字符是否等于1个字符(例如“1 /”。equals(“/”)),而不是检查这2个字符是否不包含分隔符。
你也想要一个检查器或一个try-catch块,只要输入的两个数字不是数字就可以阻止NumberFormatExcpetion
返回。
希望这有帮助
答案 1 :(得分:0)
此行中有拼写错误
} while (dval = false);
操作dval = false
始终为false
,因此您的do .. while
只会运行一次。我认为你打算使用
} while (dval == false);
有真正的循环。
要验证循环行为,您可以运行此测试并查看会发生什么:
@Test
public void testLoop() {
int iteration = 0;
boolean flag;
do {
flag = false; // unused assignment
++iteration; // iteration counter
System.out.println( "Running iteration " + iteration );
} while ( flag = false );
System.out.println( "Loop finished. Total number of iterations is " + iteration );
}