2017-04-24 14 views
-1

自分のカレンダーをプログラムしようとしています。 しかし、今私はうるう年のいくつかの問題があります。 2月29日をdatetimeに解析できません。私のコードを実行するたびに、私はエラー"文字列が有効な日時として認識されていません"を取得します。うるう年の日付をDateTimeに変換する

2月29日を解析したい場合は、エラーが発生しますが、他のすべての日付は正常に動作します。

string day = date.Text; 
string year = DateTime.Now.Year.ToString(); 
string month = tbMonat.Text; 
string stringDate = day + "." + month + "." + year; 
DateTime dt = Convert.ToDateTime(stringDate); 

私はこのエラーを取得し、なぜ誰もが、知っていて、どのように私はそれを修正することができます:ここで

は、エラーが発生した私のコードのほんの一部ですか?

編集:

ここでは、それがうるう年かではない場合、私はどのように計算するか、コードです。

case "Februar": 
      int aktuellesjahr = Int32.Parse(cbJahr.Text); 
      if((aktuellesjahr % 4 == 0 && aktuellesjahr % 100 != 0) || aktuellesjahr % 400 == 0) 
      { 
       days = 29; 
      } 
      else 
      { 
       days = 28; 
      } 
      break; 
+1

はあなたが解析しようとしている日付の年がうるう年であることを確認していますか? – Pikoh

+1

'string year = DateTime.Now.Year.ToString();' - しかし... 2017はうるう年ではありません... –

+0

うるう年かどうかを判断するコードは、2016年を閏年に解決します2017:0134: – john

答えて

2

ここにはあなたが使用できる組み込み機能DateTime.IsLeapYearがあります。

string day = date.Text; 
string year = DateTime.Now.Year.ToString(); 
string month = tbMonat.Text; 

if (!DateTime.IsLeapYear(year()) && day == 29 && month == 2) 
{ 
    MessageBox.Show("this is not leap year, please enter correct date"): 
} 
else 
{ 
    string stringDate = day + "." + month + "." + year; 
    DateTime dt = Convert.ToDateTime(stringDate); 
    //better to use like this, but you need to convert strings to ints 
    //DateTime dt = new DateTime(year, month, day); 
    //rest of your code... 
} 

EDIT:このような何かを試してみてください あなたのコードは、(ユーザーがその日のために32、または「A」または...に入ったらどう)多くの例外が発生しやすいですので、持っている方が良いでしょうそれを日付時刻に変換する前にデータをチェックする何らかの方法。このような何か:

private bool IsValidDate(string day, string month, string year) 
{ 
    int i; 
    //check if all those values for date/month/year can be converted to number 
    if (!int.TryParse(day, out i) || !int.TryParse(day, out i) || !int.TryParse(day, out i)) 
     return false; 

    //now check if date, written in format dd.MM.yyyy can be converted to DateTime. 
    DateTime dt; 
    string stringDate = day.PadLeft(2, '0') + "." + month.PadLeft(2, '0') + "." + year; 
    return DateTime.TryParseExact(stringDate, "dd.MM.yyyy", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out dt); 

} 

使い方は次のようになります:

+0

私の編集を少し見てみましょう。私はDateTime.IsLeapYear関数について取り組んだ。機能に何らかの不具合があると聞いたので。 – CallMeLeonardo

+1

IsLeapYearは '%4 == 0 &&(年%100!= 0 ||年%400 == 0)'します。だからあなたのコードで自分がやりたかったことはまったく正確です。 – Ralf

+0

@ラルフああ、大丈夫。知っておいてよかった。私は、「別の種類のカレンダーで動作する」ということについて、どこかで聞いたことがある。しかし、この場合、私はナンセンスを聞いた。 – CallMeLeonardo

2

あなたはうるう年をチェックする必要はありません。 ちょうど使用します。次に

DateTime.DaysInMonth(year, month); // return number days of a month. 

if(days > DateTime.DaysInMonth(year, month)) 
    days = DateTime.DaysInMonth(year, month) // or show an error message 
+0

私はあなたが使用する方法が本当に好きです。問題を発見しましたが、私はあなたの解決策を含めるでしょう。 – CallMeLeonardo

関連する問題