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).
InformationsquelleAutor Black Light | 2010-10-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie sich DateTime.TryParse()'s alternative überschreiben, wo es gibt Ihnen viel mehr Steuerung über, was Sie der Auffassung zu sein, ein Datum?
InformationsquelleAutor Dave Markle
Erwägen Sie die Verwendung DateTime.TryParseExact
InformationsquelleAutor max
Konvertieren von string zu Datum geben Sie entweder eine Kultur verwendet, die bestimmte format :
wie wir möchten, zu konvertieren string Datum "TT/MM/JJJJ" an Date..
oder verwenden Sie die ParseExact-Methode:
Die ParseExact-Methode akzeptiert nur diesem spezifischen format, während die "Konvertieren".ToDateTime-Methode immer noch erlaubt einige Variationen über das format, und akzeptiert auch einige andere Formate.
Fangen illegaler Eingaben, die Sie verwenden können, die TryParseExact-Methode:
Ich hoffe, dass unten links wird Ihnen etwas Hilfe:
http://dotnetacademy.blogspot.com/2010/09/convert-string-to-date.html
http://msdn.microsoft.com/en-us/library/system.datetime.tryparse.aspx
http://msdn.microsoft.com/en-us/library/9h21f14e.aspx
http://dotnetacademy.blogspot.com/2009/10/get-current-system-date-format.html
Dies ist ein Beispiel für tryParse :
http://dotnetperls.com/datetime-tryparse
Ich habe es auf meinem blog viele Monate zurück .. ich habe auch links von MSDN... also man kann nicht sagen, wie, dass
Sorry, ich war nicht wissen, dass link der eigene blog für die Lösung wird nicht akzeptiert auf stackoverflow.
Verlinkung der blogs ist in Ordnung, und die Verlinkung zu Ihrem blog in Ordnung ist. Verlinkung zu Ihrem blog, wenn die meisten Ihrer Antwort hinter dem link und dein blog-name sieht aus wie ein Firmenname riecht nach spam. Oder nicht, ob es wirklich spam ist egal - der Geruch ist da. Ihre bearbeiteten Antwort ist viel schöner, danke.
Welche Art von Logik ist das! StackOverflow ist, alle Fragen und erste Antworten. Warum ist es wichtig, dass seine blogs haben seinen Firmennamen? Wirkliche Frage ist, ob Sie Antworten oder nicht. Es scheint, dass du weißt verdammt viel mehr über spam und dann die anderen! Bin ich hier etwas fehlt?
InformationsquelleAutor Dr. Rajesh Rolen
Haben Sie ausgecheckt haben, versuchen
DateTime.TryParse
überlast akzeptiertIFormatProvider
undDateTimeStyles
Argumente? Sie können in der Lage sein zu verwenden, werden Sie mehr wählerisch, was Sie akzeptieren als eine tatsächliche Datum, die zwar nicht unnötig Ausnahme werfen, nur um zu testen die Saiten.InformationsquelleAutor Andrew Barber
Versuchen
InformationsquelleAutor sh_kamalh
am Ende ging ich mit einer version des folgenden:
InformationsquelleAutor Black Light
Dies ist natürlich ein hack, aber was ich am Ende Tat, war fügen Sie die Visual Basic-Referenz und verwenden nur die
IsDate
Funktion in C#:InformationsquelleAutor Kevin Pope
Alternativ können Sie Ihre eigenen regulären Ausdruck überprüfen, nachdem Sie ein mögliches Datum, wenn Sie erfordern ein höheres Maß an Kontrolle.
so etwas wie dieses.
deckt xx-yy-zz und xx/yy/zz wie pro Ihre Anforderung
Es scheint, dass es keine einfache Antwort in diesem Fall. Ihre Suche nach einem höheren Maß an Kontrolle, aber die Benutzerfreundlichkeit. Das ist eher eine design-Entscheidung hier. Entweder betrachten die Begrenzung der Anzahl der akzeptierten Formate oder kombinieren Sie ein paar einfache Regex-Prüfungen für Sachen wie "3/4" oder "6.12", und nach der Verwendung von DateTime.TryParse einmal in der Zeichenfolge übergeben, die regex-Ausdrücke.
Ach ja, und mit regex, Kommentare können gehen einen langen Weg
InformationsquelleAutor Terrance
Können Sie
TryParse
im OrtParse
wenn Sie überprüfen möchten, dass das argument ist ein Datum.InformationsquelleAutor shahkalpesh