2012-06-22 23 views
18

TimeSpan.Parse ("23:00:00") devuelve 23 horas.C# TimeSpan.El formato no válido devuelve un valor incorrecto en lugar de la excepción

TimeSpan.Parse ("24:00:00") devuelve 24 días.

Me doy cuenta de que cometí un error porque el rango de horas permitido es 0-23. Pero durante minutos y segundos si intenta analizar un valor fuera de rango, obtiene una excepción. En el caso de las horas con un valor fuera de rango, el analizador asume incorrectamente que significa días en lugar de horas.

¿Alguien puede explicar esto?

Este ejemplo aquí cubre este mismo tema e indica que http://msdn.microsoft.com/en-us/magazine/ee309881.aspx

El mismo parece ser cierto lo TryParse. Tengo 24 días a pesar de que los documentos indican que el análisis debe fallar.

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 

qué encontré un fallo, o estoy haciendo algo mal?

EDIT: He probado esto en LinqPad y usando una aplicación de consola en .NET4 en Windows 7 64bit.

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

Esto se traduce en:

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

Usted está comparando resultado de TryParse y analizar. El método TimeSpan.Parse (String) intenta analizar cadena (parámetro) utilizando cada uno de los formatos específicos de cultura para la cultura actual. Entonces estás recibiendo días. –

+0

Me arroja una excepción. Tal vez es una cuestión de cultura? @Romil: 'Parse' llama a' TryParse' detrás de escena, por lo que debería tener el mismo resultado. – Rawling

+2

Esto genera de manera confiable una OverflowException cuando lo intento. Mejore su pregunta documentando la versión de .NET, su cultura y las anulaciones que haya aplicado en la configuración regional de Windows. –

Respuesta

9

Lo que está pasando es que TimeSpan.Parse intenta analizar ##:##:## utilizando cada uno de los formatos siguientes en orden, deteniéndose tan pronto como uno tiene éxito:

  1. hh:mm:ss (cultura invariable)
  2. d.hh:mm (cultura invariable)
  3. hh:mm:ss (localizado)
  4. d.hh:mm (localizado; más detalles sobre el "." a continuación)

Así:

  • 23:08:09 se ha analizado correctamente como 9s 23h 8m 0d en el Paso 1.
  • 24:08:09 se ha analizado correctamente como 0s 9m 24d 8h en el Paso 4.

Si este comportamiento no le conviene, puede usar TimeSpan.ParseExact en su lugar:

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

ACTUALIZACIÓN: Según la documentación para TimeSpan.Parse, el "." entre "d" y "hh" es

Un símbolo cultural que separa los días de las horas. El formato invariante usa un carácter de punto (".").

Sin embargo, cavé en la fuente de marco con reflector, y resulta que, en el formato localizada, esta supuesta símbolo "sensible a la cultura" es siempre dos puntos! He aquí un extracto de la DateTimeFormatInfo.FullTimeSpanPositivePattern propiedad interna:

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

¿Cómo "XX: 00: 00" coincide con "d.HH: mm"? ¡No hay un período en la cadena! Esto todavía parece un resultado inesperado. –

+0

OK, esta es la mejor explicación ahora. Puedo ver por qué el código se comporta como lo hace, pero soy de la opinión de que este no es el comportamiento documentado (esperado/previsto). –

+0

Estoy de acuerdo; el comportamiento real es bastante desafortunado y sorprendente. –

Cuestiones relacionadas