2015-02-23 13 views
9

Ktoś ma pojęcie, dlaczego to się nie udaje? Byłem w stanie obejść to z ParseExact, ale chciałbym zrozumieć, dlaczego to się nie udaje.C# Błąd DateTime.Parse

DateTime test = DateTime.Parse("Dec 24 17:45"); 

Daty < "24 grudnia" działa dobrze. Terminy> = 24 gru niepowodzeniem z tego błędu:

An unhandled exception of type 'System.FormatException' occurred in mscorlib.dll Additional information: The DateTime represented by the string is not supported in calendar System.Globalization.GregorianCalendar.

EDIT: Dzięki Habib dla zauważając nawet, kiedy nie pojawia się błąd, to nie był wynik spodziewałem. Dlatego należy zachować ostrożność przy korzystaniu z narzędzia DateTime.Parse, gdy nie jest ono obsługiwane w obsługiwanych formatach!

Oto, co zrobiłem, aby rozwiązać problem. Muszę obsługiwać tylko dwa różne formaty. Bieżący rok będzie „MMM dd hh: mm” w przeciwnym razie byłoby to „MMM dd rrrr”

if (!DateTime.TryParseExact(inDateTime, "MMM dd HH:mm", System.Globalization.CultureInfo.CurrentCulture, System.Globalization.DateTimeStyles.AllowWhiteSpaces,out outDateTime)) 
{ 
    if (!DateTime.TryParseExact(inDateTime, "MMM dd yyyy", System.Globalization.CultureInfo.CurrentCulture, System.Globalization.DateTimeStyles.AllowWhiteSpaces, out outDateTime)) 
    { 
     //Handle failure to Parse 
    } 
} 
+1

Czy możesz pokazać nam dokładny kod, który próbowałeś wykonać? –

+0

To dobre pytanie. –

+0

@ A.Abramov - OP zawiera prawie wszystko, co jest potrzebne. –

Odpowiedz

9

Dates < "Dec 24" work fine. Dates >= Dec 24 fail with this error

DateTime.Parse używa standard formats za datę analizowania i powód się niepowodzeniem na Dzień> = 24, jest to, że rozważa się tej części jako części godziny zamiast części dnia, jak zakładałeś.

Ponieważ dozwolona część godzinowa może zawierać się w przedziale od 0 do 23, działa dobrze dla tych dat . (Nie jest to część dzienna)

Również ignoruje część i biorąc pod uwagę aktualną datę dla tej części.

Rozważmy poniższy przykład:

DateTime test = DateTime.Parse("Dec 22 17:45"); 

Zwraca:

test = {23/02/2015 10:17:00 PM} 

Spójrz na część czasu jest ustawiony na 22:17 lub 10:17

+0

FYI to tak naprawdę "nie działa" dla 0-23. W przypadku "Dec 23 17: 45", wraca on jako "2/23/2015 11:17:00 PM". https://dotnetfiddle.net/WyVMRl – tnw

+0

@ tnw, chodzi mi o to, że część godzinowa może mieć wartości od 0 do 23. – Habib

+0

Ah tak, wystarczy, po prostu chciałem się upewnić, że dokonano tego rozróżnienia. – tnw

-2

formatu DateTime to, że przekazujesz, jest nieprawidłowe. Uważam, że problem polega na tym, że nie dostarczasz rocznego porcji. Oto przykład akceptowanego terminu DateTime:

DateTime time = DateTime.Parse("Dec 24 2015 17:45"); 
+2

Cóż, nie o to mi chodzi .. –

+1

Rozumiem po ponownym przeczytaniu pytania. Przepraszam, że wyskoczyłem z pistoletu, byłem podekscytowany, aby zacząć pomagać i uczyć się więcej :) – MWheater82