2013-04-29 10 views
5

Consumo un servizio Web che restituisce alcune date come stringa, e io uso DateTime.Parse per ottenere gli oggetti corrispondenti DateTime. Funziona, ma temo che il mio utilizzo di DateTime.Parse potrebbe essere vulnerabile a bug causati da impostazioni internazionali diverse. La data restituita è nel seguente formato:Come analizzare correttamente un DateTime in questo formato: "2013-04-29T00: 00: 00"

2014-04-24T00:00:00 

Il codice che uso per analizzarlo:

DateTime d = DateTime.Parse(strValue); 

C'è qualche modo (come ad esempio il superamento di un provider di formato, o utilizzando un altro metodo), in cui Garantisco che la mia routine di analisi funzioni indipendentemente dalle impostazioni locali della macchina?

+2

Questo è il formato dell'ora della data ISO8601 che * non * cambia a seconda delle impostazioni della macchina. Passare la cultura non farebbe male, ma facoltativo. –

+0

Sappi anche che il risultato di uno di questi avrà un valore '.Kind' di' Non specificato' - che potrebbe o meno essere quello che ti aspettavi. –

risposta

5

Se si vuole analizzare una data indipendente locale dell'utente, quindi utilizzare il invariant culture:

DateTime d = DateTime.Parse(strValue, CultureInfo.InvariantCulture); 
+0

Sì, la tua risposta funzionerà, ma funzionerà con qualsiasi cultura. –

+0

@ MartinMulder Non è chiaro cosa intendi. Questo codice si comporterà allo stesso modo nel contesto di qualsiasi cultura: analizzerà i numeri in base alla cultura invariante e ignorerà le regole di cultura per il contesto corrente. Questo sembra essere ciò che l'OP desidera. – cdhowie

+0

Sì, ma questo è più di quello che vuole. Controlla la mia risposta. Non importa quale cultura stia usando (en-US, nl-NL, Invaruant, ecc.). Il formato che sta utilizzando è SEMPRE analizzato correttamente, quindi non è necessario fornire esplicitamente una cultura. –

1

Dal momento che si dispone di un formato esatto, mi piacerebbe usare una stringa di formato non ambigua:

DateTime.ParseExact("2014-04-24T00:00:00", "yyyy\\-MM\\-dd\\THH\\:mm\\:ss", null) 
// or to reduce the C#-escaped backslashes: 
DateTime.ParseExact("2014-04-24T00:00:00", @"yyyy\-MM\-dd\THH\:mm\:ss", null) 

I trattini e i due punti sfuggiti, così come lo escape T, indicano che si tratta di valori costanti. Quindi questa linea dovrebbe funzionare indipendentemente da altri fattori.

+0

Una grande soluzione mentre "s" sarebbe stato molto più breve! –

+1

Se "s" funziona per te, fallo. Tuttavia, ritengo che la chiarezza della sua ortografia sia utile per chiunque legga il tuo codice o per risolvere i problemi in futuro. Rimuove ogni ambiguità e non si basa su alcuno standard integrato, funziona e non funzionerà mai e non avrai mai bisogno di consultare la documentazione per scoprire perché funziona o non funziona. –

0
string dateString; 
    DateTime dateValue; 

    // Parse a string. 
    dateString = "2014-04-24T00:00:00"; 
    if (DateTime.TryParseExact(dateString, "o", CultureInfo.InvariantCulture, 
       DateTimeStyles.None, out dateValue)) 
    Console.WriteLine("Converted '{0}' to {1} ({2}).", dateString, dateValue, 
      dateValue.Kind); 
+0

Questo fallirà perché il formato "o" richiede sette posizioni decimali di secondi frazionari. –

1

Sì, è possibile utilizzare il DateTime.ParseExact

string dateString, format; 
DateTime result; 
CultureInfo provider = CultureInfo.InvariantCulture; 

dateString = "2013-04-29T00:00:00"; 
format = "s"; 

result = DateTime.ParseExact(dateString, format, provider); 

Dove la stringa di formato "s" rappresenta un DateTest ordinabile (MSDN su Format Strings)

Problemi correlati