「DateTime 構造体型を文字列に変換したい」ていう場面はよくあると思います。
単に、DateTime.ToString() とするだけで文字列に変換できますが、特定のフォーマットに合わせたい場合は少し工夫が必要です。
この記事で日付のフォーマットを指定して、文字列に変換する方法を分かりやすく説明しています。
オススメの参考書
C#の使い方が丁寧に解説しており、「基礎からしっかりと学びたい」という初心者の方にオススメの一冊です。サンプルコードも記載してあり、各章の最後に復習問題があるので理解度を確認しながら読み進めることができます。新しい C# のバージョンにも対応している書籍です。
日付の書式設定方法について
C# では、DateTime.ToString メソッドの引数に Format を指定すると、指定した書式で文字列を返します。
DateTime 構造体型を文字列に変換する際によく利用する方法です。
DateTimeオブジェクト.ToString(“カスタム日時書式指定子”);
例えば、DateTime 構造体型を年月日だけの文字列にしたい場合は、カスタム日時書式指定子に「yyyy/MM/dd」のように指定をします。
これをコードにすると次のようになります。
//現在時刻を取得
var dateTime = DateTime.Now;
//フォーマットを指定して文字列に変換
var dateTimeStr = dateTime.ToString("yyyy/MM/dd");
//文字列を出力
Debug.WriteLine(dateTimeStr);
//出力結果 : 2022/04/01
カスタム日時書式指定子については、Microsoft の公式ページに定義されています。詳しく確認したい方は「ここ」から公式サイトへ移動することができます。
使用頻度が高い書式を紹介
ここからは DateTime を文字列にする場合によく使用する「カスタム日時書式指定文字列」を紹介します。
年月日(yy/M/d)
yy/M/d
例)22/4/1
年(00~99)、月(1~12)、日(1~31)で年月日を表現します。
//2022-04-01 03:06:01.058 を指定
var dateTime = new DateTime(2022, 4, 1, 3 , 6, 1, 58);
//フォーマットを指定して文字列に変換
var dateTimeStr = dateTime.ToString("yy/M/d");
//文字列を出力
Debug.WriteLine(dateTimeStr);
//出力結果 : 22/4/1
年月日(yyyy/MM/dd)
yyyy/MM/dd
例)2022/04/01
年(0001~9999)、月(01~12)、日(01~31)で年月日を表現します。1桁の月または日は先頭に”0”が付与されます。
//2022-04-01 03:06:01.058 を指定
var dateTime = new DateTime(2022, 4, 1, 3 , 6, 1, 58);
//フォーマットを指定して文字列に変換
var dateTimeStr = dateTime.ToString("yyyy/MM/dd");
//文字列を出力
Debug.WriteLine(dateTimeStr);
//出力結果 : 2022/04/01
年月日(yyyy年MM月dd日)
yyyy年MM月dd日
例)2022年04月01日
年(0001~9999)、月(01~12)、日(01~31)で年月日を表現します。1桁の月または日は先頭に”0”が付与されます。
//2022-04-01 03:06:01.058 を指定
var dateTime = new DateTime(2022, 4, 1, 3 , 6, 1, 58);
//フォーマットを指定して文字列に変換
var dateTimeStr = dateTime.ToString("yyyy年MM月dd日");
//文字列を出力
Debug.WriteLine(dateTimeStr);
//出力結果 : 2022年04月01日
年月日(ggyy年MM月dd日)
ggyy年MM月dd日
例)令和04年04月01日
西暦ではなく、和暦で表現します。1873年1月1日より前の西暦を正確な和暦で表現することはできません。1868年9月8日より前の西暦を和暦で表示しようとするとエラー(ArgumentOutOfRangeException)になります。
//2022-04-01 03:06:01.058 を指定
var dateTime = new DateTime(2022, 4, 1, 3, 6, 1, 58);
//DateTime構造体を和暦の文字列に変換する
CultureInfo Japanese = new CultureInfo("ja-JP");
Japanese.DateTimeFormat.Calendar = new JapaneseCalendar();
//フォーマットを指定して文字列に変換
var dateTimeStr = dateTime.ToString("ggyy年MM月dd日", Japanese);
//文字列を出力
Debug.WriteLine(dateTimeStr);
//出力結果 : 令和04年04月01日
年月日時分秒(yy/M/d H:m:s)
yy/M/d H:m:s
例)22/4/1 3:6:1
年(00~99)、月(1~12)、日(1~31)、時(0~23)、分(0~59)、秒(0~59)で年月日時分秒を表現します。
//2022-04-01 03:06:01.058 を指定
var dateTime = new DateTime(2022, 4, 1, 3 , 6, 1, 58);
//フォーマットを指定して文字列に変換
var dateTimeStr = dateTime.ToString("yy/M/d H:m:s");
//文字列を出力
Debug.WriteLine(dateTimeStr);
//出力結果 : 22/4/1 3:6:1
年月日時分秒(yyyy/MM/dd HH:mm:ss)
yyyy/MM/dd HH:mm:ss
例)2022/04/01 03:06:01
年(0001~9999)、月(01~12)、日(01~31)、時(00~23)、分(00~59)、秒(00~59)で年月日時分秒を表現します。1桁の月、日、時、分、秒は先頭に”0”が付与されます。
//2022-04-01 03:06:01.058 を指定
var dateTime = new DateTime(2022, 4, 1, 3 , 6, 1, 58);
//フォーマットを指定して文字列に変換
var dateTimeStr = dateTime.ToString("yyyy/MM/dd HH:mm:ss");
//文字列を出力
Debug.WriteLine(dateTimeStr);
//出力結果 : 2022/04/01 03:06:01
年月日時分秒(yyyy年MM月dd日 HH時mm分ss秒)
yyyy年MM月dd日 HH時mm分ss秒
例)2022年04月01日 03時06分01秒
年(0001~9999)、月(01~12)、日(01~31)、時(00~23)、分(00~59)、秒(00~59)で年月日時分秒を表現します。1桁の月、日、時、分、秒は先頭に”0”が付与されます。
//2022-04-01 03:06:01.058 を指定
var dateTime = new DateTime(2022, 4, 1, 3 , 6, 1, 58);
//フォーマットを指定して文字列に変換
var dateTimeStr = dateTime.ToString("yyyy年MM月dd日 HH時mm分ss秒");
//文字列を出力
Debug.WriteLine(dateTimeStr);
//出力結果 : 2022年04月01日 03時06分01秒
年月日時分秒(yyyy年MM月dd日 tt hh時mm分ss秒)
yyyy年MM月dd日 tt hh時mm分ss秒
例)2022年04月01日 午前 03時06分01秒
カスタム書式指定子 ”tt” は、午前と午後を表現します。0:00:00 (午前 0 時) から 11:59:59.999 までは”午前”、12:00:00 (正午) から 23:59:59.999 までは”午後”になります。
//2022-04-01 03:06:01.058 を指定
var dateTime = new DateTime(2022, 4, 1, 3 , 6, 1, 58);
//フォーマットを指定して文字列に変換
var dateTimeStr = dateTime.ToString("yyyy年MM月dd日 tt hh時mm分ss秒");
//文字列を出力
Debug.WriteLine(dateTimeStr);
//出力結果 : 2022年04月01日 午前 03時06分01秒
年月日時分秒(yyyyMMddHHmmss)
yyyyMMddHHmmss
例)20220401030601
区切り記号を排除することで、全て数値として文字列に変換することができます。
//2022-04-01 03:06:01.058 を指定
var dateTime = new DateTime(2022, 4, 1, 3 , 6, 1, 58);
//フォーマットを指定して文字列に変換
var dateTimeStr = dateTime.ToString("yyyyMMddHHmmss");
//文字列を出力
Debug.WriteLine(dateTimeStr);
//出力結果 : 20220401030601
曜日(ddd)
ddd
例)金
カスタム書式指定子 ”ddd” は曜日の省略を表現します。
曜日はWindowsの「地域設定」で選択されている国によって表現が変わります。通常は地域設定は「日本」になっていると思うので、日本語で表現されます。
//2022-04-01 03:06:01.058 を指定
var dateTime = new DateTime(2022, 4, 1, 3 , 6, 1, 58);
//フォーマットを指定して文字列に変換
var dateTimeStr = dateTime.ToString("ddd");
//文字列を出力
Debug.WriteLine(dateTimeStr);
//出力結果 : 金
曜日(dddd)
dddd
例)金曜日
カスタム書式指定子 ”dddd” は曜日(省略無し)を表現します。
//2022-04-01 03:06:01.058 を指定
var dateTime = new DateTime(2022, 4, 1, 3 , 6, 1, 58);
//フォーマットを指定して文字列に変換
var dateTimeStr = dateTime.ToString("dddd");
//文字列を出力
Debug.WriteLine(dateTimeStr);
//出力結果 : 金曜日
その他(\\)
\\
例)03 h 06 m 01 s
カスタム書式指定子の文字を使いたい場合は、エスケープします。エスケープを宣言するには円記号(\\)を使い、カスタム書式指定子の前に付けます。
//2022-04-01 03:06:01.058 を指定
var dateTime = new DateTime(2022, 4, 1, 3 , 6, 1, 58);
//フォーマットを指定して文字列に変換
var dateTimeStr = dateTime.ToString("HH \\h mm \\m ss \\s");
//文字列を出力
Debug.WriteLine(dateTimeStr);
//出力結果 : 03 h 06 m 01 s
まとめ
この記事では日付のフォーマットを指定して、DateTime 型を文字列へ変換する方法を紹介しました。
ToString メソッドの引数に指定したいフォーマット(yyyy、MM、dd、HH、mm、ss 等)を渡すことで、特定の日付や時刻、またはその両方を文字列として取得することができます。
DateTime 構造体型について更に知りたい方は、こちらの記事もお勧めです。
以上、最後まで読んで頂きありがとうございました。