Wie ISO 8601 Dauer Span in VB.Net konvertieren?
Frage
Gibt es eine Standardbibliothek Methode, die einen String umwandelt, die Dauer in der Norm ISO 8601 Dauer (auch verwendet in XSD für seinen duration
Typen) Format in das .NET Timespan-Objekt hat?
Zum Beispiel P0DT1H0M0S die eine Dauer von einer Stunde darstellt, in New Timespan umgewandelt wird (0,1,0,0,0).
Ein Reverse-Wandler vorhanden ist, das funktioniert wie folgt: Xml.XmlConvert.ToString (New Timespan (0,1,0,0,0)) Der obige Ausdruck wird P0DT1H0M0S zurück.
Lösung
Dies wird von xs konvertieren: Dauer Zeitspanne:
System.Xml.XmlConvert.ToTimeSpan("P0DT1H0M0S")
Siehe http://msdn.microsoft.com /en-us/library/system.xml.xmlconvert.totimespan.aspx
Andere Tipps
Ein kleines Wort der Vorsicht - XmlConvert.ToTimeSpan () ist ein wenig komisch, wenn sie mit Monaten und Jahren. Die Klasse Timespan nicht Monat oder Jahr Mitglieder hat, wahrscheinlich, weil ihre Länge variiert. Allerdings ToTimeSpan () wird gerne eine Dauer Zeichenfolge mit Monats- oder Jahreswerten in ihm akzeptieren und Vermutung bei einer Dauer, anstatt eine Ausnahme zu werfen. Beachten Sie:
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>
Als @ima schmutzig Troll sagte Span übersetzt immer Jahre als 365 Tage und Monate als 30 Tage.
TimeSpan ts = System.Xml.XmlConvert.ToTimeSpan("P5Y");
DateTime now = new DateTime(2008,2,29);
Console.WriteLine(now + ts); // 27/02/2013 0:00:00
Um es zu adressieren Sie jedes Feld einzeln hinzufügen sollten eher als die Verwendung von 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