DateTime.Parseからfalseを返す代わりに、DateTimeとして認識される10進値


9

日付か小数かを文字列値に基づいてチェックする必要がありますが、日付解析は常に小数の場合にtrueを返します。

string val = "3.5";
DateTime oDate = DateTime.Parse(val);

有効な日付を返します3/5/2019

日付形式が不明な場合に、文字列を検証して有効な日付を知る方法は?


6
最初に小数をチェックしますか?または、使用DateTime.ParseExactできる/
友人

3
TryParseExact有効な日付形式を使用および指定できます。
juharr

5
確かに- DateTime.Parse複数のパターンを試します。特定のものだけを認識したい場合は、具体的に解析してみてください。
Jon Skeet、

回答:


3

「文字列を検証して有効な日付を知る方法は?」

問題は、それ"3.5" 有効な日付(および10進数)と見なされることです。

あなたは、常に10進タイプが必要な場合(つまり、あなたはしたくない「勝つ」isDateisDecimalの両方であるためにtrue)、あなたの検証の小数点以下のチェックが含まれます。

これを行う1つの方法は、TryParseメソッド(bool文字列を型に解析できる場合はを返し、outパラメーターを変換後の値に設定する場合)を使用して、文字列を型に変換できるかどうかを判断することです。次に例を示します。

string val = "3.5";

// temp variables to hold parsed values
DateTime tmpDate;
decimal tmpDec;
int tmpInt;

var isDecimal = decimal.TryParse(val, out tmpDec);
var isInteger = int.TryParse(val, out tmpInt);

// When checking if it's a DateTime, make sure it's not also a decimal
var isDate = !isDecimal && DateTime.TryParse(val, out tmpDate);

私はすでに試しましたが、3.5は有効な日付と有効な小数なので、まったく役に立ちません。
Munawar

1
上記のコードでは、isDateであるfalseことがチェックを含むのでisDecimal。それはあなたが求めていたものではありませんか?
Rufus L

2
@Munawar-「3.5は有効な日付と有効な小数」です。人間として、その文字列が提示され、他のコンテキストがない場合、それが日付、10進数、または他の何かであることが意図されていたかどうかはわかりません。コンピュータが魔法のように答えを出すことは期待できません。
Damien_The_Unbeliever

はい、この回答は問題に固有であり、問​​題が解決しますが、形式がわかっている場合はParseExactが最適です。
Munawar

日付の形式が「12122019」の場合に問題が発生します
Athanasios Kataras

6

ParseExact公式ドキュメントを確認してください

正確な表現がわかっている場合は、次のようにすることができます。

  format = "ddd dd MMM yyyy h:mm tt zzz";
  try {
     result = DateTime.ParseExact(dateString, format, provider);
     Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());
  }
  catch (FormatException) {
     Console.WriteLine("{0} is not in the correct format.", dateString);
  }

あなたがそれを知らなければ、あなたは文化的な欲望に悩まされます

特定のカルチャの規則を使用して、日付と時刻の文字列を解析します。Parse(String、IFormatProvider)オーバーロード(解析および文化的慣習を参照)


形式は不明ですが、ユーザーの好みに基づいた形式にすることができます。
Munawar、

1
@Munawarその状況で、2019年1月3日と2019年3月1日をどのように区別しますか?
ブレーズ

@Athanasios、アプリケーションは暗号化されて保存されたさまざまな地域と日付に使用されます。なぜなら、ユーザーは日付の形式を変更する可能性があるため、特定の形式の適用を台無しにしたくない場合は、形式がわかっている場合はParseExactが最適です。
Munawar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.