50

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
4

3 に答える 3

83

文字列に時間区切り文字を追加する必要があります。これを試して:

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

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

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

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

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

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

于 2012-09-17T19:59:01.437 に答える
12

あなたは標準で何かを逃したに違いありません。以下:

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

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

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

(にTimeSpan文字列化するに1.01:00:00。)

于 2012-09-17T19:59:23.440 に答える
4

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

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

nY-年数、例:2Y nM-
月数例:4M
nD-日数例:6D

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

例:8HnM-分数
例:12M
nS-秒数例:14S

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

ここで、月と分との混同部分は同じ文字で表されていますが、指定子の使用法により、わかりやすくするために別々になっています。

于 2018-04-17T05:26:59.943 に答える