net example asp .net xml timespan

.net - example - timespan xamarin



Cómo convertir la duración de ISO 8601 a TimeSpan en VB.Net? (3)

Esto convertirá de xs: duración a TimeSpan:

System.Xml.XmlConvert.ToTimeSpan("P0DT1H0M0S")

Consulte http://msdn.microsoft.com/en-us/library/system.xml.xmlconvert.totimespan.aspx

¿Existe un método de biblioteca estándar que convierta una cadena que tenga duración en el formato estándar ISO 8601 Duración (también utilizado en XSD para su tipo de duration ) en el objeto .NET TimeSpan?

Por ejemplo, P0DT1H0M0S que representa una duración de una hora, se convierte en New TimeSpan (0,1,0,0,0).

Existe un convertidor inverso que funciona de la siguiente manera: Xml.XmlConvert.ToString (New TimeSpan (0,1,0,0,0)) La expresión anterior devolverá P0DT1H0M0S.


Una pequeña advertencia: XmlConvert.ToTimeSpan () es un poco divertido cuando se trabaja con meses y años. La clase TimeSpan no tiene miembros de mes o año, probablemente porque su longitud varía. Sin embargo, ToTimeSpan () aceptará felizmente una cadena de duración con valores de mes o año y adivinará una duración, en lugar de lanzar una excepción. Observar:

PS C:/Users/troll> [Reflection.Assembly]::LoadWithPartialName("System.Xml") GAC Version Location --- ------- -------- True v2.0.50727 C:/Windows/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll PS C:/Users/troll> [System.Xml.XmlConvert]::ToTimeSpan("P1M") Days : 30 Hours : 0 Minutes : 0 Seconds : 0 Milliseconds : 0 Ticks : 25920000000000 TotalDays : 30 TotalHours : 720 TotalMinutes : 43200 TotalSeconds : 2592000 TotalMilliseconds : 2592000000 PS C:/Users/troll> [System.Xml.XmlConvert]::ToTimeSpan("P1Y") Days : 365 Hours : 0 Minutes : 0 Seconds : 0 Milliseconds : 0 Ticks : 315360000000000 TotalDays : 365 TotalHours : 8760 TotalMinutes : 525600 TotalSeconds : 31536000 TotalMilliseconds : 31536000000 PS C:/Users/troll>


Como @ima dirty troll dijo que TimeSpan traduce siempre años como 365 días y meses como 30 días.

TimeSpan ts = System.Xml.XmlConvert.ToTimeSpan("P5Y"); DateTime now = new DateTime(2008,2,29); Console.WriteLine(now + ts); // 27/02/2013 0:00:00

Para abordarlo, debe agregar cada campo individualmente en lugar de utilizar TimeSpan.

DateTime now = new DateTime (2008, 2, 29); string duration = "P1Y"; Regex expr = new Regex (@"(-?)P((/d{1,4})Y)?((/d{1,4})M)?((/d{1,4})D)?(T((/d{1,4})H)?((/d{1,4})M)?((/d{1,4}(/./d{1,3})?)S)?)?", RegexOptions.Compiled | RegexOptions.CultureInvariant); bool positiveDuration = false == (input [0] == ''-''); MatchCollection matches = expr.Matches (duration); var g = matches [0]; Func<int,int> getNumber = x => { if (g.Groups.Count < x || string.IsNullOrEmpty (g.Groups [x].ToString ())) { return 0; } int a = int.Parse (g.Groups [x].ToString ()); return PositiveDuration ? a : a * -1; }; now.AddYears (getNumber (3)); now.AddMonths (getNumber (5)); now.AddDays (getNumber (7)); now.AddHours (getNumber (10)); now.AddMinutes (getNumber (12)); now.AddSeconds (getNumber (14)); Console.WriteLine (now); // 28/02/2012 0:00:00