20

TimeSpan.Parse("23:00:00") は 23 時間を返します。

TimeSpan.Parse("24:00:00") は 24 日を返します!

時間の許容範囲が 0 ~ 23 であるという点で間違いを犯したことに気付きました。ただし、範囲外の値を解析しようとすると、数分と数秒で例外が発生します。範囲外の値を持つ時間の場合、パーサーは、時間ではなく日を意味していると誤って想定します。

誰かがこれを説明できますか?

この例は、まさにこのトピックをカバーしており、 http://msdn.microsoft.com/en-us/magazine/ee309881.aspxを示しています。

TryParse についても同じことが言えます。ドキュメントに解析が失敗するはずであると記載されているにもかかわらず、24日かかります。

http://msdn.microsoft.com/en-us/library/3z48198e

//            String to Parse                TimeSpan
//            ---------------   ---------------------
//                          0        00:00:00
//                         14     14.00:00:00
//                      1:2:3        01:02:03
//                  0:0:0.250        00:00:00.2500000
//             10.20:30:40.50     10.20:30:40.5000000
//        99.23:59:59.9999999     99.23:59:59.9999999
//        0023:0059:0059.0099        23:59:59.0099000
//                     23:0:0        23:00:00
//                     24:0:0   Parse operation failed.
//                     0:59:0        00:59:00
//                     0:60:0   Parse operation failed.
//                     0:0:59        00:00:59
//                     0:0:60   Parse operation failed.
//                        10:   Parse operation failed.
//                       10:0        10:00:00
//                        :10   Parse operation failed.
//                       0:10        00:10:00
//                     10:20:   Parse operation failed.
//                    10:20:0        10:20:00
//                       .123   Parse operation failed.
//                    0.12:00        12:00:00
//                        10.   Parse operation failed.
//                      10.12   Parse operation failed.
//                   10.12:00     10.12:00:00

バグを見つけましたか、それとも何か間違ったことをしていますか?

編集:これをLinqPadでテストし、Windows 7 64ビットの.NET4でコンソールアプリを使用しました。

            var result = TimeSpan.Parse("24:00:00");
            Console.WriteLine(result);
            result = TimeSpan.Parse("24:00:00", CultureInfo.InvariantCulture);
            Console.WriteLine(result);

これにより、次の結果が得られます。

24.00:00:00
24.00:00:00
4

1 に答える 1

13

何が起こっているかというと、次の各形式を順番に使用TimeSpan.Parseして解析を試み、成功するとすぐに停止します。##:##:##

  1. hh:mm:ss(不変の文化)
  2. d.hh:mm(不変の文化)
  3. hh:mm:ss(ローカライズ)
  4. d.hh:mm(ローカライズ。「.」の詳細については後述)

そう:

  • 23:08:09ステップ 1 で 0d 23h 8m 9s として正常に解析されます。
  • 24:08:09ステップ 4 で 24d 8h 9m 0s として正常に解析されます。

この動作が気に入らない場合は、代わりにTimeSpan.ParseExactを使用できます。

TimeSpan.ParseExact("23:00:00", "hh':'mm':'ss", null) // OK
TimeSpan.ParseExact("24:00:00", "hh':'mm':'ss", null) // OverflowException

更新: TimeSpan.Parseのドキュメントによると、「。」「d」と「hh」の間は

日と時間を区切るカルチャに依存した記号。インバリアント形式では、ピリオド (".") 文字が使用されます。

しかし、Reflector を使用してフレームワーク ソースを掘り下げたところ、ローカライズされた形式では、この「カルチャに依存する」シンボルは常にコロンであることがわかりました。DateTimeFormatInfo.FullTimeSpanPositivePattern内部プロパティからの抜粋を次に示します。

string separator = new NumberFormatInfo(cultureData).NumberDecimalSeparator;
this.m_fullTimeSpanPositivePattern = "d':'h':'mm':'ss'" + separator + "'FFFFFFF";
于 2012-06-22T15:17:02.710 に答える