2014/06/21

【C#】文字列をDateTime型に変換する

業務ロジックでよくあるのが「日付の妥当性チェック」
DateTime.TryParse()を使えば簡単なのだが、そんな時に限って日付を文字列(yyyyMMdd形式)で保持している。

DateTime型に変換してTryParseを使うには、日付を“yyyyMMdd”から“yyyy/MM/dd”に変換しなければならない。もちろんString型はToString("yyyy/MM/dd")なんてことできない。

“yyyyMMdd”を“yyyy/MM//dd”に変換する3つの方法をまとめていく。





地道にSubstringと文字結合


string before = "20140101";
string after = String.Empty;

after = String.Concat(
                  before.Substring(0, 4)
                , "/"
                , before.Substring(4, 2)
                , "/"
                , before.Substring(6, 2)
                );

// 出力:2014/01/01
Console.WriteLine(after);

地道に頭から4桁を年、次の2桁を月、次の2桁を日と切り抜き、“/”でつなげるというだけの何のひねりもないコーディング。
利点は、何をやってるかひと目でわかることくらい、かな?



意表をつくInsert


string before = "20140101";
string after = String.Empty;

after = before.Insert(4, "/").Insert(7, "/");

// 出力:2014/01/01
Console.WriteLine(after);


頭から4桁目に"/"を挿入、さらに"/"を追加した文字列に対して7桁目に"/"を挿入する。
2回目のInsertが6桁目なのか7桁目なのか間違えやすい。
Substringよりはキレイになってるけど…どうなんだろ?



大人っぽく正規表現


using System.Text.RegularExpressions;

string before = "20140101";
string after = String.Empty;

after = Regex.Replace(before, @"(\d{4})(\d{2})(\d{2})",@"$1/$2/$3");

// 出力:2014/01/01
Console.WriteLine(after);

みんな大好き「正規表現」を使ったのがこちら。
Substringを使うよりサッパリしたが、正規表現に詳しくない人が見たらサッパリわからないかもしれない。
やってることは第2引数(pattern)で4桁・2桁・2桁で区切り、第3引数(replacement)で切り分けたモノをスラッシュ(/)でつないでいるだけ。



その他、ググってみると「DateTime.ParseExact」が使えると書いてある記事を見つけたが、私の環境ではどうやってもできなかった。


ちなみに日付の大小チェックを行うには、以下のエントリをどーぞ。
【C#】日付のFrom-Toチェック(大小チェック)を行う | Black Everyday Company


以上

0 件のコメント :

コメントを投稿