文字列をDateTime型として解析したいときに、ParseやTryParseを使う。
DateTimeのParseは優秀なので、割となんでも解析してくれる。
しかし、変換できるものは何でも変換するため、意図しないものも変換する。
また、オリジナル要素の強い形式だと、そのままでは使えない。
そこで、ParseExactかTryParseExactを使用する。
下記に2時15分をいくつかの形式にして文字列に格納し、解析を行うコードと実行結果を乗せる。
static void Main(string[] args) { String time = "2:15"; String time2 = "02:15"; String time3 = "2時15分"; String time4 = "0215"; var dataTime = new DateTime(); if (DateTime.TryParse(time, out dataTime)) { Console.WriteLine(String.Format("時刻は:{0}", dataTime.ToString("yyyy/MM/dd HH:mm:ss"))); } else { Console.WriteLine(String.Format("{0}を解析できませんでした", time)); } if (DateTime.TryParse(time2, out dataTime)) { Console.WriteLine(String.Format("時刻は:{0}", dataTime.ToString("yyyy/MM/dd HH:mm:ss"))); } else { Console.WriteLine(String.Format("{0}を解析できませんでした", time2)); } if (DateTime.TryParse(time3, out dataTime)) { Console.WriteLine(String.Format("時刻は:{0}", dataTime.ToString("yyyy/MM/dd HH:mm:ss"))); } else { Console.WriteLine(String.Format("{0}を解析できませんでした", time3)); } if (DateTime.TryParse(time4, out dataTime)) { Console.WriteLine(String.Format("時刻は:{0}", dataTime.ToString("yyyy/MM/dd HH:mm:ss"))); } else { Console.WriteLine(String.Format("{0}を解析できませんでした", time4)); } if (DateTime.TryParseExact(time4, "HHmm", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out dataTime)) { Console.WriteLine(String.Format("時刻は:{0}", dataTime.ToString("yyyy/MM/dd HH:mm:ss"))); } else { Console.WriteLine(String.Format("{0}を解析できませんでした", time4)); } Console.ReadLine(); }
ほとんどは問題ないが0215など、215年なのか2月15日なのか判断できないものがある。
その場合に、ParseExtraで書式を指定すると、解析可能になる。
また、ファイル名などを付ける際にわかりやすいように、hogefile_0215とつけるようにしたいのに、hogefile_215となってしまっては困るといった場合に必ずHH:mm形式を強制させたい場合にも使える。
ちなみに、TryParseExtraの3つ目の引数はカルチャーで、とりあえずCultureInfo.InvariantCulture (System.Globalization) を指定するかNullでも現在のカルチャーが使用されるらしい。
4つ目は、DateTimeStylesで解析する際に空白文字をどうするかなどのオプションのようだ。
とりあえずSystem.Globalization.DateTimeStyles.Noneで普通のParseコマンドと同じになる。
基本はParseやTryParseで十分だけど、たまにオリジナル書式を解析する必要が有ったり厳密性が必要だったりの場合に思い出すといいかも。
追記
意外だが、20140925といったよく使われるyyyyMMdd形式は普通にはParseできなかかった。
yyyyMMdd形式の場合は下記の通り。
VB.NET (*この例はVB.NETだけど、C#もほぼ同じ。)
Dim strDate As String = "20140925" Dim myDate As DateTime = DateTime.ParseExact(strDate, "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture)