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:
-
hh:mm:ss
(cultura invariante) -
d.hh:mm
(cultura invariante) -
hh:mm:ss
(localizado) -
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";