2015-02-23 2 views
9

Qualcuno ha idea del perché questo non funziona? Sono stato in grado di aggirarlo con ParseExact, ma mi piacerebbe capire perché sta fallendo.C# DateTime.Parse Errore

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

Date < "24 dicembre" funzionano correttamente. Date> = 24 Dic riuscire con questo errore:

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: Grazie a Habib per notare anche quando non ho ottenuto un errore che non era il risultato che mi aspettavo. Quindi fai attenzione con DateTime.Parse quando non viene utilizzato con i formati supportati!

Ecco cosa ho fatto per risolvere il problema. Devo solo gestire due diversi formati. L'anno in corso sarebbe "MMM GG HH: MM" altrimenti sarebbe "MMM GG AAAA"

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

Puoi mostrarci il codice esatto che hai provato ad eseguire? –

+0

Questa è una buona domanda. –

+0

@ A.Abramov - L'OP includeva praticamente tutto ciò che è necessario. –

risposta

9

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

DateTime.Parse usa il standard formats per la data l'analisi e la ragione sta venendo a mancare per il giorno di> = 24, è che si sta considerando quella parte come parte dell'ora invece della parte del giorno come si presuppone.

Poiché l'ora consentita può essere compresa tra 0 e 23, funziona bene per le date . (Non è considerata una parte del giorno)

Inoltre ignora la parte Dec e considera la data corrente per quella parte.

Si consideri il seguente esempio:

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

Restituisce:

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

Guardate la parte di tempo è impostato su 22:17 o 10:17

+0

FYI in realtà non "funziona" per 0-23. Per 'Dec 23 17: 45', torna come' 2/23/2015 11:17:00 PM'. https://dotnetfiddle.net/WyVMRl – tnw

+0

@ tnw, volevo dire che la parte delle ore è consentita per avere valori da 0 a 23. – Habib

+0

Ah sì, abbastanza giusto, volevo solo assicurarmi che la distinzione fosse fatta. – tnw

-2

Il formato DateTime che stai passando non è valido. Credo che il problema sia che non stai fornendo un anno per la parte relativa alla data. Ecco un esempio di un DateTime accettato:

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

Beh, non è questo il punto che penso .. –

+1

Ho capito dopo aver riletto la domanda. Scusa se ho saltato la pistola, ero solo felice di iniziare ad aiutare e imparare di più da sola :) – MWheater82