2013-07-23 14 views
8

In C# come si analizza una stringa di formato "dd/mm/yyyy" o il formato "dd-mm-yyyy" in data/ora? Viene visualizzato un errore che indica che la mia stringa non è nel formato corretto. Devo essere in grado di analizzare tutti i formati non solo uno di essi.C# analizzando qualsiasi stringa di formato data su datetime

+1

Mostraci il tuo codice. – SLaks

+6

"Devo essere in grado di analizzare tutti i formati" - dato che esistono entrambi i formati 'gg/mm/aaaa' e' mm/gg/aaaa', qualsiasi data per il dodicesimo o prima del mese deve essere ambigua - è un problema irrisolvibile da un computer. –

+0

Mostraci il codice che hai provato. –

risposta

8

mm significa minuto, maiuscolo MM significa mese.

Oltre a questo, è necessario utilizzare CultureInfo.InvariantCulture se si vuole analizzare le stringhe con / come separatore della data poiché questo è il carattere di sostituzione per il separatore della data della vostra cultura corrente:

Così funziona:

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

Vedere: The "/" Custom Format Specifier

+0

+1 per mm vs. MM. – Corak

1

È possibile utilizzare il metodo DateTime.ParseExact con qualsiasi formato specificato.

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

La stringa del formato è errata. 'mm' è minuto, non mese. –

+0

@JohnKoerner grazie per averlo capito. – doogle

3

È necessario definire i formati di data che si desidera accettare. Non esistono cose come tutti i formati. Dopo aver definito che è possibile passare serie formato DateTime.ParseExact

Il codice può assomigliare a questo:

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

È possibile definire qualsiasi formato che ti piace - più si può ottenere un elenco di valori di default per una determinata cultura.

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(); 

uscita:

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 
Problemi correlati