45

これは少し奇妙です。正確にしようとすると、有効なタイムスパンでテキスト フィールドを解析できません!

const string tmp = "17:23:24";
//works
var t1 = TimeSpan.Parse(tmp);
//fails
var t2 = TimeSpan.ParseExact(tmp, "hh:mm:ss", System.Globalization.CultureInfo.InvariantCulture);

2 番目の解析は、「入力文字列の形式が正しくありませんでした」という例外で失敗します。日時から。

4

6 に答える 6

98

ドキュメントから:

空白文字を含む、書式指定文字列内のその他のエスケープされていない文字は、カスタム書式指定子として解釈されます。ほとんどの場合、他のエスケープされていない文字が存在すると、FormatException が発生します。

フォーマット文字列にリテラル文字を含める方法は 2 つあります。

  • 一重引用符 (リテラル文字列の区切り記号) で囲みます。

  • エスケープ文字として解釈されるバックスラッシュ ("\") を前に付けます。つまり、C# では、書式文字列を @ で囲むか、リテラル文字の前にバックスラッシュを追加する必要があります。

.NET Framework は、時間間隔の区切り記号の文法を定義していません。これは、日と時、時と分、分と秒、および秒と秒の小数部の間の区切り文字はすべて、フォーマット文字列内の文字リテラルとして処理する必要があることを意味します。

したがって、解決策は、フォーマット文字列を次のように指定することです

TimeSpan.ParseExact(tmp, "hh\\:mm\\:ss", CultureInfo.InvariantCulture)
于 2012-07-30T09:57:23.523 に答える
10

これを試して:

var t2 = TimeSpan.ParseExact(tmp, "c", System.Globalization.CultureInfo.InvariantCulture);

ソース: 標準の TimeSpan フォーマット文字列

于 2012-07-30T10:01:12.720 に答える
3

HH は実際にはそうではないようですTimeSpan

カスタム TimeSpan 形式指定子には、日と時間、時間と分、または秒と小数秒を区切る記号などのプレースホルダー区切り記号は含まれません。代わりに、これらの記号を文字列リテラルとしてカスタム フォーマット文字列に含める必要があります。たとえば、「dd.hh\:mm」は、ピリオド (.) を日と時間の区切り記号として定義し、コロン (:) を時間と分の区切り記号として定義します。

したがって、正しい方法は、 「\」 を使用してエスケープするためにジョンが述べたようになります続きを読む

あなたTimeSpanは24時間形式の「17:23:24」HHであり、12時間形式ではなく形式を使用して解析する必要がありhhます。

TimeSpan.ParseExact(tmp, "HH:mm:ss",System.Globalization.CultureInfo.InvariantCulture);

フォーマットを確認する

于 2012-07-30T09:55:36.607 に答える
0

これを試して:

     var t2 = TimeSpan.ParseExact(tmp, "HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture);
于 2012-07-30T09:56:25.517 に答える