Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 比较和循环未按预期工作_Java_Date_Loops_Do While - Fatal编程技术网

Java 比较和循环未按预期工作

Java 比较和循环未按预期工作,java,date,loops,do-while,Java,Date,Loops,Do While,我正在用Java编写一个程序,基本上可以找到两个特定日期之间的天数。用户以DD/MM/YYYY格式输入两个日期,我获取日/月/年的子字符串,并计算两个日期之间的天数。我还做了一种验证,如果格式错误(例如d/mm/yyyy),那么此人必须以正确的格式重新写入日期。我这样做是为了确保日期中的/处于正确的位置。如果4/匹配,则布尔变量为true,程序继续,如果不匹配,则为false,并再次请求日期 问题是它总是给我错误的答案,即使这样,它也没有重新循环 import java.util.*; pub

我正在用Java编写一个程序,基本上可以找到两个特定日期之间的天数。用户以DD/MM/YYYY格式输入两个日期,我获取日/月/年的子字符串,并计算两个日期之间的天数。我还做了一种验证,如果格式错误(例如d/mm/yyyy),那么此人必须以正确的格式重新写入日期。我这样做是为了确保日期中的/处于正确的位置。如果4/匹配,则布尔变量为true,程序继续,如果不匹配,则为false,并再次请求日期

问题是它总是给我错误的答案,即使这样,它也没有重新循环

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));
}
}

以下是一些有关其工作原理的图像:

输入正确时:

输入不正确时:

如果不正确,它只是在尝试将1/转换为整数时陷入困境,我可以理解

有什么帮助吗


非常感谢。

据我所知,您的问题是在获取日期的
子字符串()时。您正在检查位置是否等于“/”,但您有两个位置(因此错误显示您要转换的字符串和int在错误代码中为“1/”

尝试更改所有If语句行,如下所示:

while()
语句应该是
=
,而不仅仅是
=
。您要设置它,而不是检查循环的每个迭代

您现在不是检查两个字符是否等于一个字符(例如“1/”。等于(“/”),而是检查这两个字符是否不包含分隔符

此外,您还需要一个checker或try-catch块,以防输入的两个数字不是数字,从而阻止
numberformateception
返回


希望这对您有所帮助

您在这一行有输入错误

 } 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 );
}

我发现的第一件事是:代码中缺少了一些大括号。现在的代码将报告日期格式错误,即使它是正确的。为什么你要自己解析日期,而不是使用
SimpleDataFormat
?我想我已经把它整理好了。我只是用Y和N将布尔字符串改为普通字符串,看起来很好。另外,谢谢Gimby发现了花括号的东西。现在它更有意义了。
 } 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 );
}