2010-10-19 11 views
18

I String Datetime analysieren müssen. Der String ist immer in folgendem FormatBenötigen dd.MM.yyyy zu Datetime mit TryParse analysieren

"10.10.2010" Das bedeutet dd.MM.yyyy, mit Punkten getrennt.

Ich möchte DateTime.TryParse oder jede andere Methode verwenden. Bitte vorschlagen.

UPDATE

die Frage aktualisiert. Ich suche nur nach der richtigen Methode, um das Ziel zu erreichen. Nicht manuelle Analyse

Antwort

39

TryParse lässt Sie nicht das Format angeben - aber Sie können TryParseExact verwenden:

DateTime date; 
if (DateTime.TryParseExact(text, "dd'.'MM'.'yyyy", 
          CultureInfo.InvariantCulture, 
          DateTimeStyles.None, 
          out date)) 
{ 
    // Success 
} 
else 
{ 
    // Parse failed 
} 

Beachten Sie, dass Der Punkt muss nicht unbedingt maskiert werden mit den Anführungszeichen, aber ich persönlich setze gerne einen beliebigen Text in Anführungszeichen, um sicherzustellen, dass er nicht geändert wird. Es ist jedoch eine persönliche Vorliebe Sache - Sie könnten sicherlich einfach "dd.MM.yyyy" verwenden, wenn Sie wollten.

Ich habe die invariante Kultur Ebenso angegeben, das ist, was ich für einen festen benutzerdefinierten Stil normalerweise tun - aber man könnte es die aktuelle Kultur oder eine bestimmte andere Kultur verwenden, wenn Sie wollen. Wenn Sie einen benutzerdefinierten Stil verwenden (und nicht einen Standardstil wie "langes Datum"), ist es wahrscheinlich weniger wahrscheinlich, dass dies einen Unterschied macht.

+0

Cool, danke Jon. –

+0

was, wenn ich gezwungen bin, tryparse zu schreiben, gibt es dann irgendwelche arbeit? – Neel

+0

@Neel: Warum sollten Sie 'Tryparse' benutzen? Welche anderen Einschränkungen gibt es? Kennst du das Format?Können Sie die Kultur im 'TryParse'-Aufruf angeben? –

4

Warum nicht ParseExact stattdessen verwenden?

var theDate = DateTime.ParseExact("dd.MM.yyyy", yourDateString, CultureInfo.InvariantCulture); 
+1

-1 nicht ganz - das kann Ausnahme auslösen ... – Dror

+0

@Dror, wenn Sie die Frage lesen, werden Sie sehen: „Der String ist immer in folgendem Format“, was bedeuten würde, dass die OP könnte Verwenden Sie einfach ParseExact. Und er könnte, falls nötig, einen Versuchsblock dafür benutzen. –

+0

lässt sich nicht kompilieren –

7

Verwenden Sie die TryParseExact Methode:

DateTime parsed; 
if (DateTime.TryParseExact(yourString, "dd'.'MM'.'yyyy", 
    CultureInfo.CurrentCulture, DateTimeStyles.None, out parsed)) 
{ 
    // success 
} 
+0

'null' ist kein gültiger 'DateTimeStyles'-Wert. –

+0

@Jon: Ja, das ist mir gerade klar geworden. Bearbeiten ... – LukeH

4

Brasilien Codec

public static bool IsDateTime(string txtDate) 
{ 
    DateTime tempDate; 

    return DateTime.TryParseExact(txtDate,"dd/MM/yyyy", 
           new CultureInfo("pt-BR"), 
           DateTimeStyles.None, out tempDate); 
} 
1

try "ddMMyyy", ohne. "- /"

0

Ich habe festgestellt, dass Jquery Datepicker nicht druckbare Zeichen in der Zeichenfolge hinzufügen. Wenn Sie also versuchen, in ein anderes Format zu konvertieren, wird jedes Mal ein ungültiger Datumsfehler ausgegeben. In meinem Fall habe ich nur versucht, es in einen Zeitstempel umzuwandeln, aus welcher Kultur auch immer sich der Benutzer gerade befand. Es ist ein etwas hacky Ansatz, aber es hat für mich funktioniert.

static public string ToDigitsOnly(string input) 
    { 
     Regex digitsOnly = new Regex(@"[^\d]"); 
     return digitsOnly.Replace(input, ""); 
    } 

    static private DateTime ConvertDateTimeToDate(string dateTimeString, String langCulture) 
    { 

     System.DateTime result; 

     string[] dateString = dateTimeString.Split('/'); 


     try 
     { 
      if (langCulture != "en") 
      { 
       int Year = Convert.ToInt32(ToDigitsOnly(dateString[2])); 
       int Month = Convert.ToInt32(ToDigitsOnly(dateString[1])); 
       int Day = Convert.ToInt32(ToDigitsOnly(dateString[0])); 
       result = new DateTime(Year, Month, Day, 00, 00, 00); 
      } 
      else 
      { 
       int Year = Convert.ToInt32(dateString[2]); 
       int Month = Convert.ToInt32(dateString[0]); 
       int Day = Convert.ToInt32(dateString[1]); 
       result = new DateTime(Year, Month, Day, 00, 00, 00); 
      } 
     } 
     catch 
     { 
      // last attempt 
      result = Convert.ToDateTime(dateTimeString, CultureInfo.GetCultureInfo("en-US")); 
     } 

     return result; 
    }