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.

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top