Schreiben Sie eine IsDate () - äquivalent in C#?

Entschuldige mich, wenn dies wurde gebeten vor. Ich habe einige Daten, die ich brauche, um zu speichern, wie strings, Daten, Termine. Die Daten beginnt als Zeichenfolgen wie "01/02/10" (uk-format). Nun, später werden diese Daten analysiert und, je nachdem, was hat die Analyse, die Ergebnisse sind unterschiedlich (01-Feb-10 vs. 02-Jan-10 zum Beispiel). Da die Daten beginnt wie strings, bevor ich es gespeichert, ich möchte sagen, "wenn dies sieht aus wie ein Datum-format TT-mmm-yy".

Sich die Mühe, dass viele Dinge, die Aussehen wie ein Datum zu dem DateTime.Parse () - Funktion.

So, ich bewarb mich einige Regeln und akzeptieren nur "angemessene" Datum-Formate für meine Prüfungen, und schrieb eine IsDate () - Funktion. Ich Suche Vorschläge, wie dies zu tun ist, weil, während es funktioniert, meine Lösung scheint sehr klobig.

Der ganze Grund, warum ich Tat dies, anstatt zu gehen nach unten die üblichen DateTime.TryParse-routine ist klar, ob Sie jemals fing an zu werfen zufällige Zeichenketten an (wie "3/4" und "6.12").

Hier ist, was ich habe, so weit:

class Program
{
  static void Main(string[] args)
  {
     Debug.Assert(IsDate(6.12) == false);
     Debug.Assert(IsDate("3/4") == false);
     Debug.Assert(IsDate(010210) == false);
     Debug.Assert(IsDate("010210") == false);
     Debug.Assert(IsDate("12-jan-2000") == true);
     Debug.Assert(IsDate("12-12-20") == true);
     Debug.Assert(IsDate("1/1/34") == true);
     Debug.Assert(IsDate("09/30/20") == false);
     Debug.Assert(IsDate(DateTime.Now) == true);
  }

  static Boolean IsDate(Object value)
  {
     DateTimeFormatInfo DateTimeFormatGB = new CultureInfo("en-GB").DateTimeFormat; //new CultureInfo("en-US").DateTimeFormat;
     return IsDate(value, DateTimeFormatGB);
  }

  static private List<String> AcceptableDateFormats = new List<String>(72);
  static Boolean IsDate(Object value, DateTimeFormatInfo formatInfo)
  {
     if (AcceptableDateFormats.Count == 0)
     {
        foreach (var dateFormat in new[] { "d", "dd" })
        {
           foreach (var monthFormat in new[] { "M", "MM", "MMM" })
           {
              foreach (var yearFormat in new[] { "yy", "yyyy" })
              {
                 foreach (var separator in new[] { "-", "/" }) //formatInfo.DateSeparator ?
                 {
                    String shortDateFormat;
                    shortDateFormat = dateFormat + separator + monthFormat + separator + yearFormat;
                    AcceptableDateFormats.Add(shortDateFormat);
                    AcceptableDateFormats.Add(shortDateFormat + " " + "HH:mm"); //formatInfo.TimeSeparator
                    AcceptableDateFormats.Add(shortDateFormat + " " + "HH:mm:ss");
                 }
              }
           }
        }
     }

     String sValue = value.ToString().Trim();
     DateTime unused;

     foreach (String format in AcceptableDateFormats)
     {
        if (DateTime.TryParseExact(sValue, format, formatInfo, DateTimeStyles.None, out unused) == true) return true;
     }

     return false;
  }
}

Ich habe nicht den Datum/Zeit-Separatoren aus der Kultur-Informationen, weil ich wollte, akzeptiert ein "/" und "-". Ich denke, ich hätte die Zeit, die man aber, wie das ist unwahrscheinlich zu ändern (für mich).

Warum nicht mit DateTime.TryParse, dann tun einige sanity-check zum Beispiel auf Jahr Teil der zurückgegebene DateTime?

InformationsquelleAutor Black Light | 2010-10-15

Schreibe einen Kommentar