0

私はJavaでプログラムを書いています。これは、基本的に2つの特定の日付の間の日数を検出します。ユーザーがDD/MM / YYYY形式で2つの日付を入力し、日/月/年のサブ文字列を取得して、2の間の日数を計算します。また、形式が間違っている場合は、ある種の検証を行いました。 (たとえば、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));
}

}

これがどのように機能しているかについてのいくつかの画像です:

入力が正しい場合:http: //vvcap.net/db/2100RYdaSM1T6EXLqgq5.png

入力が正しくない場合:http: //vvcap.net/db/9qSEwDKSTIdLAWmxS_Cy.png

正しくない場合、整数で1 /を作成しようとすると、スタックします。これは理解できます。

何か助けはありますか?

どうもありがとう。

4

2 に答える 2

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 );
}
于 2013-01-04T09:49:41.677 に答える
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;
 ...

ANDwhile()ステートメントは==単なるではありません=。ループの各反復をチェックするのではなく、設定しています。

2文字が1文字に等しいかどうかをチェックするのではなく(たとえば、 "1 /"。equals( "/"))、これらの2文字に区切り文字が含まれていないかどうかをチェックしています。

また、入力された2桁が数値でない場合に備えて、チェッカーまたはtry-catchブロックが必要ですNumberFormatExcpetion

お役に立てれば

于 2013-01-04T09:32:43.480 に答える