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
文字列に時間セパレータを追加する必要があります。これを試して:
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)が定義されていないため、これらのアプリケーションでは週を使用しないでください。
あなたは標準で何かを逃したにちがいない。以下:
System.Xml.XmlConvert.ToString(TimeSpan.FromHours(12))
文字列PT12H
を返します。したがって、時間部分の前にT
を付ける必要があるようです。そして、以下は正しく解析します:
System.Xml.XmlConvert.ToTimeSpan("PT25H")
(1.01:00:00
に文字列化されるTimeSpan
に。)
System.Xml.XmlConvert.ToTimeSpan("PnYnMnDTnHnMnS")
には次の形式を使用してください。
P-指定子は日付形式の前に配置する必要があります。
nY-年数、例:2Y
nM-月数の例:400万
nD-日数の例:6D
T-時間形式の前に配置する必要がある指定子
nH-時間数ex:8H
nM-分数の例:12M
nS-秒数の例:14SSystem.Xml.XmlConvert.ToTimeSpan("P2Y4M6DT8H14M18S")
ここでは、MonthとMinutesの混同部分は同じ文字で示されていますが、デジグネーターを使用すると、わかりやすくするために区別されます。