web-dev-qa-db-ja.com

ISO8601 TimeSpanをC#TimeSpanに変換するにはどうすればよいですか?

System.FormatException(例として)以下を実行しようとすると、

TimeSpan ts = XmlConvert.ToTimeSpan("P72H");

私は ISO8601標準 を調査しましたが、それは正しいようですが、何をしても、例外をスローせずに何時間も解析できません。

ありがとう!

編集:

例外の詳細:

System.FormatException was unhandled by user code
HResult=-2146233033
Message=The string 'P72H' is not a valid TimeSpan value.
Source=System.Xml
42
Codeman

文字列に時間セパレータを追加する必要があります。これを試して:

TimeSpan ts = XmlConvert.ToTimeSpan("PT72H");

期間の仕様を参照してください- http://www.w3.org/TR/xmlschema-2/#duration

3.2.6.1字句表現
期間の字句表現は、[ISO 8601]拡張形式PnYn MnDTnH nMnSです。ここで、nYは年数、nMは月数、nDは日数、 'T'は日付/時刻ですセパレータ、nHは時間数、nMは分数、nSは秒数。秒数には、任意の精度の10進数を含めることができます。

コメントに基づいて編集/更新

なぜ文字列P2M2W5Dは有効なTimeSpanとは見なされません。WはISO 8601規格の一部であるため、この更新を追加して、誰かがその問題に遭遇した場合に読む必要がないようにしました答えを得るためにコメントを通して。問題、問題の元の文字列の両方P72HおよびP2M2W5Dは、文字列がW3C XMLスキーマに準拠している必要があることです( XmlConvert.ToTimeSpan のドキュメントを参照)。 W3C XMLスキーマ(上記のリンク)を見ると、ISO 8601標準、特にWが有効な文字ではない理由を示すセクション5.5.3.2.1を参照しています。 XMLスキーマ:

週にはキャリーオーバーポイント(52または53)が定義されていないため、これらのアプリケーションでは週を使用しないでください。

68
pstrjds

あなたは標準で何かを逃したにちがいない。以下:

System.Xml.XmlConvert.ToString(TimeSpan.FromHours(12))

文字列PT12Hを返します。したがって、時間部分の前にTを付ける必要があるようです。そして、以下は正しく解析します:

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

1.01:00:00に文字列化されるTimeSpanに。)

10
millimoose

System.Xml.XmlConvert.ToTimeSpan("PnYnMnDTnHnMnS")には次の形式を使用してください。

P-指定子は日付形式の前に配置する必要があります。

nY-年数、例:2Y
nM-月数の例:400万
nD-日数の例:6D

T-時間形式の前に配置する必要がある指定子

nH-時間数ex:8H
nM-分数の例:12M
nS-秒数の例:14S

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

ここでは、MonthとMinutesの混同部分は同じ文字で示されていますが、デジグネーターを使用すると、わかりやすくするために区別されます。

2
Ravikumar B