0

したがって、さまざまな形式の日付になる可能性のある文字列があります。成功するまでそれぞれを試行し、変換された日付を返すか、形式に一致しない場合はエラーをスローするメソッドを作成したかったのです。私はこれを書いた:

private string ConvertDate(string toConvert)
{
    if (string.IsNullOrEmpty(toConvert)) { return ""; }

    DateTime date;
    bool success = DateTime.TryParseExact(toConvert,
            "MMddyy",
            new CultureInfo("en-US"),
            DateTimeStyles.None,
            out date);

    if (!success)
    {
        success = DateTime.TryParseExact(toConvert,
            "MMddyyyy",
                new CultureInfo("en-US"),
            DateTimeStyles.None,
            out date);
    }
    if (!success)
    {
        success = DateTime.TryParseExact(toConvert,
            "MM/dd/yy",
            new CultureInfo("en-US"),
            DateTimeStyles.None,
            out date);
    }
    if (!success)
    {
        success = DateTime.TryParseExact(toConvert,
            "MM/dd/yyyy",
            new CultureInfo("en-US"),
            DateTimeStyles.None,
            out date);
    }
    if (!success) throw new Exception("Date formats are not recognized");

    return date.ToString();
}

それは機能しますが、それをすべて書くのはかなりばかげていると思います。1回のパスでさまざまな日付形式をチェックする簡単な方法があるはずだと思います。何か案は?

4

2 に答える 2

3

これは、少なくとも保守が容易です。関数名は誤解を招きますが。おそらくStandardizeDateFormatのようなものになるはずです。

private string ConvertDate(string toConvert)
{
    if (string.IsNullOrEmpty(toConvert)) { return ""; }

    string[] dateFormats = new string[]{"MMddyy","MMddyyyy","MM/dd/yy","MM/dd/yyyy"};
    DateTime date;
    bool success = false;
    for(int i = 0;i<dateFormats.Length &&!success;i++)
    {
        success = DateTime.TryParseExact(toConvert,
        dateFormats[i],
            new CultureInfo("en-US"),
            DateTimeStyles.None,
            out date);
    }
    if (!success) throw new Exception("Date formats are not recognized");

    return date.ToString();
}

編集:実際には、おそらくさらに単純化するでしょう

private string ConvertDate(string toConvert)
{
    if (string.IsNullOrEmpty(toConvert)) { return ""; }

    string[] dateFormats = new string[]{"MMddyy","MMddyyyy","MM/dd/yy","MM/dd/yyyy"};
    DateTime date;
    for(int i = 0;i<dateFormats.Length ;i++)
    {
        if(DateTime.TryParseExact(toConvert, dateFormats[i], new CultureInfo("en-US"), DateTimeStyles.None, out date))
            return date.ToString();
    }
    throw new Exception("Date formats are not recognized");
}
于 2012-12-13T21:46:48.640 に答える
1

このようなことを試してください。MMが常に最初で、年が2000 or later(yyフォーマットの場合)であると仮定します。

string date = "10/25/2011";
string[] arr = date.ToArray() 
              .Where(ch => ch > 47 && ch < 58 ) //Filter out all but numbers
              .Select(s => s.ToString()).ToArray(); 

if(arr.Length >5)
{
   string ISOformattedDate = string.Format( arr.Length == 6 ? 
          "{4}{5}-{0}{1}-{2}{3}T00:00:00" : 
          "{4}{5}{6}{7}-{0}{1}-{2}{3}T00:00:00", arr);
   DateTime mydate = Convert.ToDateTime(ISOformattedDate);
}
于 2012-12-13T22:01:12.477 に答える