2011-07-14 3 views
-2

私は毎日の現在の日付でフォームをユーザーが入力する1つの入力フォームを持っています。さて、ユーザーがフォームに入力しなかった日付を表示する必要があります。2つの日付の値をどのように計算するのですか?

入力した日付とその日の日数を取得しました。私はこの両方の値を比較する方法と、入力されていない日付を印刷する方法を知らない。

ありがとうございます。

+2

質問を再入力してください - 私はそれを理解していません! – Justin

+2

C#を投稿してください。 –

+1

ドキュメントを読むことは非常に便利です。特に、あなたはこの方法に遭遇するかもしれません:[DateTime.Compare](http://msdn.microsoft.com/en-us/library/system.datetime.compare.aspx) –

答えて

0

フォームに記入された日付を記録することができれば提供されます。あなたがしなければならないことは、今月の長さのループを書くことだけです。

その時点で、あなたの日付のコレクションに現在の反復が存在するかどうかを確認するだけです。日付がコレクション内に含まれていない場合は、結果を出力します。

System.DateTime.DaysInMonth(int year、int month)は、ループの反復回数を決定します。

あなたがしなければならないのは、現在の月と年を抽出することだけです。

0

私が考えることができる最も簡単な方法は、フォームに入力された日付をスキップして、年のすべての日付を印刷することです。例えば:

for(int i=1;i<13;i++){ 
    String month = Integer.toString(i); 
    for(int j=1;j<32;j++){ 
     String date = month+"/"+Integer.toString(j); 
     if (date in listOfValidDates): 
      if(date in filedDates): 
       continue; 
      System.out.println(date) 
     } 
    } 

更新:それは私はそれがC#に最も似ています知っている言語なので、擬似コードからJavaへの例を変更しました。

+2

@KeithS - 正直なところ、擬似コードはユーザーにもっと役立ち、単に彼に答えを与えるだけです。その明確なユーザーは、アルゴリズムを書く能力を持っていないので、単純に提供されているかどうかはわかりません。 –

2

基本的には、月の初めに開始し、その月の各日にDateTime値を作成したいと思うでしょう。これらの日のそれぞれをその月のすべての入力値と比較し、一致しない場合は、生成されたDateTimeを出力します。ここにあなたを始めるための基本的なアルゴリズムがあります。あなたが必要とする日付の範囲をカバーするために、必要に応じて変更することができます

//I leave you the exercise of actually getting the entered dates in DateTime format 
List<DateTime> enteredDates = GetEnteredDatesAsDateTimes(); 
var unenteredDates = new List<DateTime>(); 

//I assume you want days for the current month; 
//if not you can set up a DateTime using a specified month/year 
var today = DateTime.Today; 
var dateToCheck = new DateTime(today.Year, today.Month, 1); 

//You could also make sure the date is less than the current date, 
//or less than a specified "end date". 
while (dateToCheck.Month == today.Month) 
{ 
    //uses Linq, which requires .NET 3.5 
    if(!enteredDates.Any(d=>d.Date == dateToCheck.Date)) 
     unenteredDates.Add(dateToCheck); 

    //use the below code instead for .NET 2.0 
    //bool inList = false; 
    //foreach(var date in enteredDates) 
    // if(enteredDate.Date == date.Date) 
    // { 
    //  inList = true; 
    //  break; 
    // } 
    //if(!inList) unenteredDates.Add(dateToCheck); 

    dateToCheck = dateToCheck.AddDays(1); 
} 

//unenteredDates now has all the dates for which the user didn't fill out the form. 

が、これはN^2 - 複雑なアルゴリズムであることを理解し、 1つのリストの各要素を別の要素の各要素と比較していて、2つのリストがほぼ等しい基数であると考えています。数ヶ月間の日付をチェックしていない限り、ひどく実行すべきではありません。これをNlogNに減らすには、入力した日付のリストをソートし、リニアの代わりに日付をバイナリ検索します。これにより、記述する必要のあるコードが増えますが、コードで実行する必要があるステップが減ります。