DateTimeの指定書式
よくある書式指定
日付(DateTime)を文字列に変換することはよく行うと思います。
その時に出力する書式を指定するため、カスタム書式を利用しますね。
「日付は"/"で区切って、時刻は":"区切りで出力」という、よくある書式で出そうと思うと、このように書くことが多いと思います。
DateTime dt = new DateTime(2017, 1, 17, 8, 7, 4);
Console.WriteLine("日時は {0} です♪", dt.ToString("yyyy/MM/dd hh:mm:ss"));
さて、上記のコードでは出力される文字はなんでしょうか。
「日時は 2017/01/17 08:07:04 です♪」になりそうですが__そうなるとは限りません__
ええっ、違うの?ダレカタスケテー
"/",":" もカスタム書式指定子
見落としがちですが、"/",":"もカスタム書式として定義されています。
(詳細は"/" カスタム書式指定子、":" カスタム書式指定子を見てください)
要するに、"/",":" は日付、時刻の一般的な区切り文字を指定する書式であり、
"/",":"という固定の文字列を出力するわけではありません。
これはDateTimeのカルチャに依存します。
(日本のカルチャだと日付、時刻の区切り文字は「/」「:」で書式の文字と一致するため、勘違いしやすいですね)
日付、時刻の区切り文字を思ったように出力するには
そういう訳で、日付や時刻の区切り文字を厳密に指定したい場合の書き方です。
大きく2パターンあるので、好みに合わせて使ってください。
固定文字列として出力する
日付や時刻の区切り文字は固定なのだし、文字列でいいじゃん。という訳で日付、時刻を区切る場所に
固定の文字列として"/"、":"を設置する方法です。
DateTime dt = new DateTime(2017, 1, 17, 8, 7, 4);
Console.WriteLine("日時は {0} です♪", dt.ToString("yyyy'/'MM'/'dd hh':'mm':'ss"));
区切り文字を指定する
フォーマット時に利用する日付、区切り文字を明示すればいいじゃん。という訳で明示的に日付、区切り文字を指定する方法です。
System.Globalization.DateTimeFormatInfo dtf = new System.Globalization.DateTimeFormatInfo();
dtf.DateSeparator = "/";
dtf.TimeSeparator = ":";
DateTime dt = new DateTime(2017, 1, 17, 8, 7, 4);
Console.WriteLine("日時は {0} です♪", dt.ToString("yyyy/MM/dd hh:mm:ss"), dtf);
まとめ
仕様書では明確に記載されていますが、ついつい見落としがちなDateTimeのカスタム書式についてでした。
書式が少々違っても問題ない場合は気にする必要はありませんが、システム的に固定の書式でないと問題が起きる場合はきちんと明示するようにしましょう。