11

私はそのDateTime.TryParseExact方法を試していますが、私が得られないケースに遭遇しました。いくつかの形式といくつかのサブジェクトを解析する必要があり、それぞれが形式の 1 つに完全に一致する必要があります。

var formats = new[]
     {
         "%H",
         "HH",
         "Hmm",
         "HHmm",
         "Hmmss",
         "HHmmss",
     };

var subjects = new[]
     {
         "1",
         "12",
         "123",
         "1234",
         "12345",
         "123456",
     };

次に、それらすべてを解析して結果を出力しようとします。

foreach(var subject in subjects)
{
    DateTime result;
    DateTime.TryParseExact(subject, formats, 
        CultureInfo.InvariantCulture, 
        DateTimeStyles.NoCurrentDateDefault,
        out result);

    Console.WriteLine("{0,-6} : {1}", 
        subject,
        result.ToString("T", CultureInfo.InvariantCulture));
}

私は以下を取得します:

1      : 01:00:00
12     : 12:00:00
123    : 00:00:00
1234   : 12:34:00
12345  : 00:00:00
123456 : 12:34:56

そして私の質問に...なぜ123と12345で失敗するのですか? それらは 01:23:00 と 01:23:45 になるべきではありませんか? ここで何が欠けていますか?そして、どうすれば期待どおりに動作させることができますか?


更新:というわけで、これがうまくいかない理由を突き止めたようです。Hは実際には 2 桁を取得してから、 に 1 つだけ残して失敗mmするようです。しかし、探している結果が得られるようにこのコードを変更する方法について、誰かが良い考えを持っていますか?

別の更新:合理的な解決策を見つけたと思います。回答として追加しました。他の誰かがさらに良いものを考え出さない限り、2 日以内に受け入れます。助けてくれてありがとう!

4

6 に答える 6

13

わかりましたので、ここでより多くの読書、実験、およびその他の役立つ回答のおかげで、これをすべて理解したと思います。何が起こっているかというと、Hm、およびsは、残りの形式に十分な桁数がない場合でも、可能な場合は実際に 2 桁を取得します。たとえば、形式Hmmと数字123を使用すると、Hは12を取得し、残りは3だけになります。mmには 2 桁の数字が必要なため、失敗します。タダー

したがって、私の解決策は現在、代わりに次の 3 つの形式のみを使用することです。

var formats = new[]
    {
        "%H",
        "Hm",
        "Hms",
    };

私の質問の残りのコードは同じままで、結果として次のようになります。

1      : 01:00:00
12     : 12:00:00
123    : 12:03:00
1234   : 12:34:00
12345  : 12:34:05
123456 : 12:34:56

これは合理的で受け入れられるべきだと思います:)

于 2010-01-06T21:37:31.947 に答える
3

0123 012345

そのような数字の文字列が見つかった場合、2/4/6 の長さを探していると思います。123 は AM または PM のどちらでしょうか? 0123 はそれほど曖昧ではありません。

于 2010-01-06T21:04:58.920 に答える
2

カスタム書式パターンで日付区切り記号または時刻区切り記号を使用しない場合は、プロバイダー パラメーターにインバリアント カルチャを使用し、各カスタム書式指定子の最も広い形式を使用します。たとえば、パターンで時間を指定する場合は、狭い形式の "H" ではなく、広い形式の "HH" を指定します。

引用: http://msdn.microsoft.com/en-us/library/ms131044.aspx

他の人が指摘しているように、H は 1 日 10 時間であることを意味するため、H はあいまいです。HH は 12 です。

于 2010-01-06T21:13:04.153 に答える
1

私は間違っている可能性がありますが、フォーマット文字列の「H」部分に固有のあいまいさに関係している可能性があると思われます。つまり、文字列「123」が与えられた場合、時間「1」(01: 00) または時間 "12" (12:00); TryParseExactどちらが正しいかわからないため、false を返します。

メソッドが「最良の推測」を提供しない理由については、ドキュメントはこれに関するあなたの側にはありません。DateTime.TryParse に関する MSDN ドキュメントから(強調鉱山):

変換が成功した場合、または 変換が失敗した場合は、このメソッドが返さ れるときに、 sDateTimeに含まれる日付と時刻に相当する値が含まれます。sまたはformat パラメーターがであるか、空の文字列であるか、または formatで指定されたパターンに対応する日付と時刻が含まれていない場合、変換は失敗します。このパラメーターは初期化されずに渡されます。DateTime.MinValuenull

于 2010-01-06T21:07:38.507 に答える
1

MSDN のUsing Single Custom Format Specifiersから引用するには:

カスタムの日付と時刻の形式文字列は、2 つ以上の文字で構成されます。たとえば、書式文字列が指定子 h のみで構成されている場合、書式文字列は標準の日付と時刻の書式指定子として解釈されます。ただし、この特定のケースでは、標準の日付と時刻の形式指定子がないため、例外がスローされます。

単一のカスタム日時書式指定子を使用するには、日時指定子の前後にスペースを含めるか、単一のカスタム日時指定子の前にパーセント (%) 書式指定子を含めます。たとえば、書式文字列 "h " および "%h" は、現在の日付と時刻の値で表される時間を表示するカスタムの日付と時刻の書式文字列として解釈されます。スペースが使用されている場合は、結果文字列にリテラル文字として表示されることに注意してください。

では、それは配列% Hの最初の要素にあるはずでしたか?formats

これがお役に立てば幸いです。よろしくお願いします、トム。

于 2010-01-06T21:12:00.370 に答える
0

"123" と "12345" は、TryParseExact メソッドに関してあいまいなようです。たとえば、「12345」は 12:34:50 または 01:23:45 のいずれかになります。推測ですが。

于 2010-01-06T21:07:14.623 に答える