ネタ元:時間区切り指定
.NET で何でこうなるか調べてみた。
カスタムの日付と時刻の書式指定文字列
をみると、":" はカスタム書式指定子扱いで、DateTimeFormatInfo.TimeSeparator プロパティ (System.Globalization) の値が使用されると書かれています。
確実に":"を表示する場合は、"\"でエスケープすればよいようです。
短い時刻の形式を変更してみました。
ここから、既定のカルチャの Timeseparator は長い時刻の形式を使っているのかなと思われます。
続いて、
"yyyy/MM/dd HH:mm:ss" で指定した物の時刻が "HH時mm時ss" と表示されていますが、これは Timeseparator が 時/分/秒 関係無く一つの値しか持っていないせいでしょう。
それより気になるのが、ToShortTimeString の結果です。なんか怪しいですね。現在のカルチャの Timeseparator と ShortTimePattern を表示してみました。
ShortTimePattern が H:mm になっていて、Timeseparator が "時" なので、ToShortTimeString の結果が、"H時mm" なんですね!
これはハマるなぁ。ToShortTimeString の結果を "H:mm" としたいなら、短い時刻の形式を次の様に変更します。
おまけ
":" をエスケープした場合は、Timeseparator の影響を受けません。