parse initialize example ejemplos day c# timespan

c# - initialize - timespan tostring



El formato no válido de C#TimeSpan.Parse devuelve un valor incorrecto en lugar de una excepción (1)

TimeSpan.Parse ("23:00:00") devuelve 23 horas.

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

Me doy cuenta de que cometí un error porque el rango permitido de horas es 0-23. Pero por 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 se refería a 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

Lo mismo parece ser cierto acerca de TryParse. Tengo 24 días a pesar de los documentos que indican que el análisis debería 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

¿Encontré un error o estoy haciendo algo mal?

EDITAR: 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 resulta en:

24.00:00:00 24.00:00:00


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

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

Asi que:

  • 23:08:09 se analiza con éxito como 0d 23h 8m 9s en el Paso 1.
  • 24:08:09 se analiza con éxito como 24d 8h 9m 0s en el Paso 4.

Si este comportamiento no le conviene, puede usar TimeSpan.ParseExact 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 de TimeSpan.Parse , el "." entre "d" y "hh" es

Un símbolo sensible a la cultura que separa días de horas. El formato invariable utiliza un carácter de punto (".").

Sin embargo, busqué en la fuente del marco con Reflector, y resulta que, en el formato localizado, ¡este supuesto símbolo "sensible a la cultura" siempre es un signo de dos puntos! Aquí hay un extracto de la propiedad DateTimeFormatInfo.FullTimeSpanPositivePattern interna:

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