VB.Net에서 ISO 8601 기간을 TimeSpan으로 변환하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/62804

  •  09-06-2019
  •  | 
  •  

문제

표준 ISO 8601 기간(XSD에서도 사용됨)의 기간이 있는 문자열을 변환하는 표준 라이브러리 방법이 있습니까? duration 유형) 형식을 .NET TimeSpan 개체로 변환하시겠습니까?

예를 들어, 1시간의 기간을 나타내는 P0DT1H0M0S는 New TimeSpan(0,1,0,0,0)으로 변환됩니다.

다음과 같이 작동하는 역방향 변환기가 존재합니다.xml.xmlconvert.tostring (New Timespan (0,1,0,0,0)) 위의 표현식은 p0dt1h0m0s를 반환합니다.

도움이 되었습니까?

해결책

그러면 xs:duration이 TimeSpan으로 변환됩니다.

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

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

다른 팁

한 가지 사소한 주의 사항 - XmlConvert.ToTimeSpan()은 월 및 연도로 작업할 때 약간 이상합니다.TimeSpan 클래스에는 월 또는 연도 멤버가 없습니다. 아마도 길이가 다양하기 때문일 것입니다.그러나 ToTimeSpan()은 월 또는 연도 값이 포함된 기간 문자열을 허용하며 추측하다 예외를 발생시키는 대신 일정 기간 동안.관찰하다:

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>

@ima dirty troll이 말했듯이 TimeSpan은 항상 연도를 365일로, 월을 30일로 변환합니다.

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

이를 해결하려면 타임 스팬을 사용하지 않고 각 필드를 개별적으로 추가해야합니다.

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top