Domanda

Esiste un metodo di libreria standard che converte una stringa che ha durata nella durata standard ISO 8601 (utilizzata anche in XSD per la sua duration type) nell'oggetto .NET TimeSpan?

Ad esempio, P0DT1H0M0S che rappresenta una durata di un'ora, viene convertito in New TimeSpan(0,1,0,0,0).

Esiste un convertitore inverso che funziona come segue:Xml.xmlconvert.toString (New Timespan (0,1,0,0,0)) L'espressione di cui sopra restituirà p0dt1h0m0s.

È stato utile?

Soluzione

Questo convertirà da xs:duration a TimeSpan:

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

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

Altri suggerimenti

Un piccolo avvertimento: XmlConvert.ToTimeSpan() è un po' strano quando si lavora con mesi e anni.La classe TimeSpan non ha membri del mese o dell'anno, probabilmente perché la loro lunghezza varia.Tuttavia, ToTimeSpan() accetterà volentieri una stringa di durata con valori di mese o anno al suo interno e Indovinare ad una durata, invece di lanciare un'eccezione.Osservare:

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>

Come ha detto @ima dirty troll, TimeSpan traduce sempre gli anni in 365 giorni e i mesi in 30 giorni.

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

Per affrontarlo dovresti aggiungere ogni campo individualmente anziché usare 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top