2012-06-22 9 views
18

TimeSpan.Parse ("23:00:00") restituisce 23 ore.C# TimeSpan.Parse formato non valido restituisce il valore errato anziché l'eccezione

TimeSpan.Parse ("24:00:00") restituisce 24 giorni!

Mi rendo conto che ho fatto un errore in quanto l'intervallo di ore consentito è 0-23. Ma per minuti e secondi se si tenta di analizzare un valore fuori intervallo si ottiene un'eccezione. Nel caso di ore con un valore fuori intervallo, il parser presuppone in modo errato che si intendano giorni anziché ore.

Qualcuno può spiegarlo?

Questo esempio qui si estende su questo argomento e indica che http://msdn.microsoft.com/en-us/magazine/ee309881.aspx

Lo stesso sembra essere vero su TryParse. Ottengo 24 giorni nonostante i documenti affermino che l'analisi dovrebbe fallire.

http://msdn.microsoft.com/en-us/library/3z48198e

//   String to Parse    TimeSpan 
//   --------------- --------------------- 
//       0  00:00:00 
//       14  14.00:00:00 
//      1:2:3  01:02:03 
//     0:0:0.250  00:00:00.2500000 
//    10.20:30:40.50  10.20:30:40.5000000 
//  99.23:59:59.9999999  99.23:59:59.9999999 
//  0023:0059:0059.0099  23:59:59.0099000 
//      23:0:0  23:00:00 
//      24:0:0 Parse operation failed. 
//      0:59:0  00:59:00 
//      0:60:0 Parse operation failed. 
//      0:0:59  00:00:59 
//      0:0:60 Parse operation failed. 
//      10: Parse operation failed. 
//      10:0  10:00:00 
//      :10 Parse operation failed. 
//      0:10  00:10:00 
//      10:20: Parse operation failed. 
//     10:20:0  10:20:00 
//      .123 Parse operation failed. 
//     0.12:00  12:00:00 
//      10. Parse operation failed. 
//      10.12 Parse operation failed. 
//     10.12:00  10.12:00:00 

ho trovato un bug o sto facendo qualcosa di sbagliato?

MODIFICA: Ho provato questo in LinqPad e utilizzando un'app Console in .NET4 su Windows 7 a 64 bit.

  var result = TimeSpan.Parse("24:00:00"); 
      Console.WriteLine(result); 
      result = TimeSpan.Parse("24:00:00", CultureInfo.InvariantCulture); 
      Console.WriteLine(result); 

Questo si traduce in:

24.00:00:00 
24.00:00:00 
+0

si sta confrontando risultato di TryParse e analizzare. Il metodo TimeSpan.Parse (String) tenta di analizzare la stringa (parametro) utilizzando ciascuno dei formati specifici della cultura per la cultura corrente. Quindi stai ricevendo giorni. –

+0

Getta un'eccezione per me. Forse è una cosa culturale? @Romil: 'Parse' chiama' TryParse' dietro le quinte quindi dovrebbero avere lo stesso risultato. – Rawling

+2

Questo genera in modo affidabile OverflowException quando lo provo. Migliora la tua domanda documentando la versione di .NET, la tua cultura e eventuali sostituzioni che potresti aver applicato nelle impostazioni regionali di Windows. –

risposta

9

Cosa sta succedendo è che TimeSpan.Parse tenta di analizzare ##:##:## utilizzando ciascuno dei seguenti formati in ordine, fermandosi non appena si riesce:

  1. hh:mm:ss (cultura invariante)
  2. d.hh:mm (cultura invariante)
  3. hh:mm:ss (localizzato)
  4. d.hh:mm (localizzato; maggiori dettagli sul "." qui di seguito)

Quindi:

  • 23:08:09 viene analizzato con successo come 0d 9s 23h 8m al punto 1.
  • 24:08:09 viene analizzato con successo come 24d 8h 0s 9m nella Fase 4.

Se questo comportamento non ti soddisfa, puoi utilizzare TimeSpan.ParseExact invece:

TimeSpan.ParseExact("23:00:00", "hh':'mm':'ss", null) // OK 
TimeSpan.ParseExact("24:00:00", "hh':'mm':'ss", null) // OverflowException 

UPDATE: Secondo la documentazione per TimeSpan.Parse, il "." tra "d" e "hh" è

Un simbolo sensibile alla cultura che separa i giorni dalle ore. Il formato invariante utilizza un carattere punto (".").

Tuttavia, ho scavato nella sorgente framework con Reflector, e si scopre che, nel formato localizzato, questo presunto simbolo "sensibile alla cultura" è sempre un colon! Ecco un estratto dal DateTimeFormatInfo.FullTimeSpanPositivePattern proprietà interna:

string separator = new NumberFormatInfo(cultureData).NumberDecimalSeparator; 
this.m_fullTimeSpanPositivePattern = "d':'h':'mm':'ss'" + separator + "'FFFFFFF"; 
+0

Come "XX: 00: 00" corrisponde a "d.HH: mm"? Non c'è periodo nella stringa! Questo sembra ancora un risultato inaspettato. –

+0

OK, questa è la migliore spiegazione ora. Posso capire perché il codice si comporta come fa, ma sono dell'opinione che questo non sia il comportamento documentato (previsto/voluto?). –

+0

Sono d'accordo; il comportamento attuale è piuttosto sfortunato e sorprendente. –

Problemi correlati