2013-07-23 16 views
8

W języku C# jak przeanalizować ciąg formatu "dd/mm/yyyy" lub formatu "dd-mm-yyyy" na datetime? Wystąpił błąd informujący, że mój ciąg znaków nie ma poprawnego formatu. Muszę umieć analizować wszystkie formaty, nie tylko jeden z nich.C# parsowanie dowolnego ciągu formatu daty do datetime

+1

Pokaż nam swój kod. – SLaks

+6

"Muszę umieć analizować wszystkie formaty" - biorąc pod uwagę, że istnieją formaty "dd/mm/yyyy" i "mm/dd/yyyy", daty dwunastej lub wcześniejszej w danym miesiącu muszą być niejednoznaczne - to problem nierozwiązywalny przez komputer. –

+0

Pokaż nam kod, który wypróbowałeś. –

Odpowiedz

8

mm oznacza minutę, wielkie litery MM oznacza miesiąc.

Oprócz tego, trzeba użyć CultureInfo.InvariantCulture jeśli chcesz zanalizować ciągi z / jako separator daty, ponieważ jest to char zamiennik separator daty Twoim obecnym językiem jest:

Tak to działa:

DateTime.ParseExact("23/07/2013", "dd/MM/yyyy", CultureInfo.InvariantCulture); 

Zobacz: The "/" Custom Format Specifier

+0

+1 dla mm vs. MM. – Corak

1

Możesz użyć metody DateTime.ParseExact z dowolnym określonym formatem.

var d = DateTime.ParseExact(token, "dd-MM-yyyy", 
      CultureInfo.InvariantCulture, 
      DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AssumeUniversal); 
+0

Twój ciąg formatu jest nieprawidłowy. "mm" jest minutą, nie miesiącem. –

+0

@JohnKoerner dzięki za złapanie tego. – doogle

3

Musisz zdefiniować formaty dat, które chcesz zaakceptować. Nie ma czegoś takiego jak wszystkie formaty. Po zdefiniowaniu, które można przekazać w formacie tablicę DateTime.ParseExact

Twój kod może wyglądać następująco:

string[] formats = new string[2] {"dd/MM/yyyy", "dd-MM-yyyy"}; 

string date = "23-02-2013"; 
try 
{ 
    DateTime result = DateTime.ParseExact(date, formats, CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal); 
} 
catch (FormatException) 
{ 
    // your error handling code here 
} 
8

Można zdefiniować dowolny format chcesz - plus można uzyskać listę domyślnych dla danej kultury.

var ci = new CultureInfo("en-US"); 
var formats = new[] { "M-d-yyyy", "dd-MM-yyyy", "MM-dd-yyyy", "M.d.yyyy", "dd.MM.yyyy", "MM.dd.yyyy" } 
     .Union(ci.DateTimeFormat.GetAllDateTimePatterns()).ToArray(); 

DateTime.ParseExact("07/23/2013", formats, ci, DateTimeStyles.AssumeLocal).Dump(); 
DateTime.ParseExact("07-23-2013", formats, ci, DateTimeStyles.AssumeLocal).Dump(); 
DateTime.ParseExact("23-07-2013", formats, ci, DateTimeStyles.AssumeLocal).Dump(); 
DateTime.ParseExact("23.07.2013", formats, ci, DateTimeStyles.AssumeLocal).Dump(); 

wyjściowa:

7/23/2013 12:00:00 AM 
7/23/2013 12:00:00 AM 
7/23/2013 12:00:00 AM 
7/23/2013 12:00:00 AM