2011-12-30 7 views
5

それだけで動作するように望んでいない:TryParseExactは24時間だけの文字列ですか?

DateTime time; 

DateTime.TryParseExact("17", "HH", ..., out time); 
    // works fine 

DateTime.TryParseExact("9", "HH", ..., out time); 
    // works fine, but 9 doesn't match HH (nor should it) 

DateTime.TryParseExact("9:", "H':'", ..., out time); 
    // works fine 

DateTime.TryParseExact("9", "H", ..., out time); 
    // exception: "Input string was not in a correct format" 

#3作品は明らかに回避策を提供していますが、それは私がそれを見たなら、私は「WTF」を行かせるだろうものの一つだという事実を誰かのコード。 TryParseExactはバグでしょうか?

+0

DateTimeの代わりにTimeSpanに変換する方がいいかもしれません... – Francisco

+0

@Francisco私はそうは思わない、 'TimeSpan'は" am/pm "のようなものを解析しません。なぜなら、それはある時点ではなく時間_span_を表すからです。そして、あなたは "それは私たちが2.5時を要した"のようなものを決して持っていません。 –

答えて

8

。 、ゼロのいずれかを招くことなく24時間クロックに時間を解析する

だけ"H"形式を使用するように誘惑することができるが、custom date and time format"H"standard date and time formatとして解釈されることにつながるであろう、二つ以上の文字で構成されなければなりません形式の例外が発生します。フォーマット文字列(つまり、「d」を使用するためには、「F」、「Fのみ 指定子としてカスタムの日付と時刻の書式指定子のいずれかを使用するには

MSDN on Custom Date and Time Format Stringsから

「h」、「H」、「K」、「m」、「M」、「s」、「t」、「y」、「z」、「:」、「/」、「/」、 "カスタム書式 指定子)、指定子の前後に空白を入れてください( )。また、カスタムの の日付と時刻の指定子の前にパーセント("% ")書式指定子を含めてください。

私は私が前または後のスペースは、タイプミスと解釈することもできるし、他の誰かによって除去されることを見つけるため、前%記号を含めることを好みます。

0

何、このようにそれを使用する方法について:あなたはDateTime.TryParseExact("5", "%H", null, DateTimeStyles.None, out time)を使用することができます

DateTime dt; 
DateTime.TryParseExact("09", "HH", null, 
    System.Globalization.DateTimeStyles.None, out dt); 
+1

"9"はユーザー入力です。私はちょうど彼らに0を入力するように頼むことはできません。 –

+0

文字列の長さが1の場合、0を前に付けることができます。とにかく、JoãoAngeloの答えは美しく機能します。 – epignosisx