web-dev-qa-db-ja.com

TimeSpan.ParseExactが機能しないのはなぜですか

これは少し奇妙です。正確にしようとすると、有効な期間のテキストフィールドの解析が失敗します。

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番目の解析は、「入力文字列が正しい形式ではありませんでした」という例外で失敗します。 DateTimeから。

39
Quango

ドキュメント から:

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

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

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

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

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

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

TimeSpan.ParseExact(tmp, "hh\\:mm\\:ss", CultureInfo.InvariantCulture)
80
Jon

これを試して:

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

ソース: Standard TimeSpan Format Strings

8
M. Mennan Kara

TimeSpan.ParseExactDateTime.ParseExactの形式指定子の違いに対応したくない場合は、文字列をDateTimeとして解析し、TimeOfDayコンポーネントを取得するだけです。このようなTimeSpanとして:

var t2 = DateTime.ParseExact(tmp, "hh:mm:ss", CultureInfo.InvariantCulture).TimeOfDay;
4
samgak

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

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

したがって、正しい方法は、Jonが "\"Read More を使用してエスケープすることを述べたとおりです。

あなたのTimeSpan "17:23:24"であり、24時間形式であり、HH形式であり、12時間形式のhhではありません。

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

チェックアウト 形式

2
V4Vendetta

これを試して:

     var t2 = TimeSpan.ParseExact(tmp, "HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture);
0
speti43