0

データベースからいくつかの結果を取得しており、それをループしています。DateTime.Parseメソッドを使用して、日付の場合はすべての値を確認します。

static void Main(string[] args)
{
    DateTime dateValue;
    string s = "107.5"; //5/1/0107
    var canConvert = DateTime.TryParse(s, out dateValue);
    var val = canConvert ? dateValue.ToString("d") : s;
    if (canConvert)
    {
        Console.WriteLine(val);
    }
    Console.ReadKey();
}

問題は、値「107.5」を渡すと、システムがそれを有効な日付と見なし、5/1/0107 を返すことです。その背後には何らかの有効なロジックがあるに違いないと確信しています。そのロジックは何ですか?また、 を含む値への変換を無視するようにコンパイラに指示するにはどうすればよいですか.。明らかに、値に a が含まれているかどうかを確認できます。含まれている.場合は、変換を無視できます。しかし、私はそのように行きたくありません。日付がどの形式で返されるかはわかりませんが、.

4

2 に答える 2

2

唯一のオプションについては、有効な形式を決定し、有効な解析が行われるか、有効な形式がなくなるまで、それぞれを順番に試すことです。

var validFormats = new[]{"dd/MM/yyyy","yyyy-MM-dd"};
var dateStrings = new[]{ "13/10/2012","2000-01-01","107.2"};

DateTime dt = DateTime.MinValue;
foreach(var d in dateStrings)
{
     if(DateTime.TryParseExact(d, validFormats, 
               CultureInfo.CurrentCulture, DateTimeStyles.None, out dt))
    {
        Console.WriteLine(dt);
    }
    else
    {
        Console.WriteLine("{0} is not valid",d);
    }
}

実際の例: http://rextester.com/IXZIG43823

于 2013-02-05T08:38:42.760 に答える
0

形式または可能な形式がわかっている場合は、DateTime.TryParseExactメソッドを使用できます。

ただし、可能な形式がわからない場合は、この問題を回避する別の方法として、日付の「サニティ チェック」があります。

var canConvert = DateTime.TryParse(s, out dateValue);
if (canConvert && (dateValue.Year < 1900 || dateValue.Year > 2100))
    canConvert = false;

これにより、無効な日付に手動で「フラグ」が付けられます。もちろん、年の範囲を変更できます。

于 2013-02-05T08:41:05.040 に答える