2012-03-09 10 views
5

Ho una stringa di data che sta arrivando come quello che ritengo essere Mddyyyy. Tuttavia, TryParseExact non sembra funzionare. Ecco il codice di esempio che non riesce:Perché una chiamata a DateTime.TryParseEx non riesce con l'input "1212012" utilizzando la stringa di formato "Mddyyyy"

string datestring = "1212012"; 

DateTime td; 
if (DateTime.TryParseExact(datestring, "Mddyyyy", new CultureInfo("en-US"),  DateTimeStyles.None, out td)) 
{ 
    Console.WriteLine(td.ToShortDateString()); 
} 
else 
{ 
    Console.WriteLine("Invalid Date String"); 
} 

Lo stesso codice funziona se c'è uno zero, ma potrebbe pensare allora che lo zero potrebbe funzionare solo con una stringa di formattazione di MMGGAAAA.

+5

Suggerimento: il tuo esempio è datato 21 gennaio 2012 o 1 dicembre 2012? Inoltre, apprezziamo la vera domanda nel tuo post (anche se penso che sia sicuro supporre che stai chiedendo "Come faccio a provare TryParseExact analizzare questa data?") –

+0

Vedo l'ambiguità, ma ciò significa che le date di gennaio con giorni in l'intervallo 10-29 è inaccessibile per DateTime quando viene fornito nel formato Mddyyyy? Mi rendo conto che non dovresti usare questo formato per le date, ma sono curioso. – Odrade

+0

Molto probabilmente sì. Puoi sistemarlo imbottendo a sinistra con zero. Il motivo probabile è la struttura del parser o dell'espressione regolare utilizzata da TryParseExact. Il primo M implica un numero variabile di cifre iniziali che specificano il mese, con un percorso decisionale corretto che è conoscibile solo osservando la lunghezza totale della stringa. Scommetto che il parser non è così sofisticato, anche se ammetto che non ho guardato. –

risposta

2

Qui propongo una spiegazione e fornire prove per la proposta.

Proposto Spiegazione: Il parser utilizza internamente la stringa di formato per creare un'espressione regolare che contiene un quantificatore avido (cioè, in questo caso, si preferisce abbinare mesi 2 cifre over mesi 1 cifra). Lo M nella stringa di formato dell'OP diventa qualcosa come \d{1,2} (sebbene ciò corrisponda ai mesi numerati da 0 a 99!) Nell'espressione regolare interna del parser.

Evidence: Se si sposta il mese fino alla fine di entrambi i dati e la stringa di formato, il quantificatore avido non può ottenere più di 1 cifra e in modo che corrisponda il mese come desiderato:

string datestring = "2120121"; 

DateTime td; 
if (DateTime.TryParseExact(datestring, "ddyyyyM", new CultureInfo("en-US"), DateTimeStyles.None, out td)) 
{ 
    Console.WriteLine(td.ToShortDateString()); 
} 
else 
{ 
    Console.WriteLine("Invalid Date String"); 
} 

Bottom Line: non fare affidamento su comportamenti non documentati. Utilizza sempre dati univoci, ad esempio mesi a 2 cifre.

+0

Ho finalmente avuto la possibilità di esaminare il codice di analisi stesso - mentre questa non è una risposta precisa (perché nessuna regex è in realtà usato) è funzionalmente accurato, e sono d'accordo con la linea di fondo. –

+0

@ChrisShain Quale codice? Codice sorgente? I L? –

+0

sì, l'IL. Usando il riflettore puoi vederlo come qualcosa di simile al C# originale –

Problemi correlati