はじめに 「日付フォーマット」は“人間に読める形に整える”最後の仕上げ
業務システムでは、DBや内部処理では DateTime / DateTimeOffset のまま扱い、
画面・CSV・ログ・帳票などに出すときに「文字列」に変換します。
この「日時 → 文字列」の変換ルールが 日付フォーマット です。
同じ日時でも、
2026/02/10 20:152026-02-10T20:15:002026年2月10日(火) 20時15分20260210
など、用途によって“正解の形”が変わります。
だからこそ、フォーマットをユーティリティとして整理しておくと、業務コードが一気に読みやすく・安全になります。
ここから、
基本の書き方 → よく使うフォーマット → 実務ユーティリティ化 → ありがちな落とし穴
の順にかみ砕いて説明していきます。
基本:ToString("書式") で日付を文字列にする
一番シンプルな形
C# では、DateTime や DateTimeOffset に対して ToString("書式") を呼ぶことで、
好きな形の文字列に変換できます。
DateTime dt = new DateTime(2026, 2, 10, 20, 15, 30);
string s1 = dt.ToString("yyyy/MM/dd");
string s2 = dt.ToString("yyyy-MM-dd HH:mm");
string s3 = dt.ToString("yyyyMMddHHmmss");
Console.WriteLine(s1); // 2026/02/10
Console.WriteLine(s2); // 2026-02-10 20:15
Console.WriteLine(s3); // 20260210201530
C#ここで使っている "yyyy/MM/dd" などが「書式文字列」です。
この中の y, M, d, H, m, s などに意味があります。
よく使う書式指定子をざっくり押さえる
日付部分
yyyy… 西暦4桁(2026)MM… 月2桁(02)dd… 日2桁(10)
dt.ToString("yyyy/MM/dd"); // 2026/02/10
dt.ToString("yyyy-MM-dd"); // 2026-02-10
C#時刻部分
HH… 24時間制の時(00〜23)mm… 分(00〜59)ss… 秒(00〜59)
dt.ToString("HH:mm"); // 20:15
dt.ToString("HH:mm:ss"); // 20:15:30
C#ミリ秒・タイムゾーンなど
fff… ミリ秒(3桁)zzz… UTCからのオフセット(+09:00 など)
DateTimeOffset dto = new DateTimeOffset(2026, 2, 10, 20, 15, 30, TimeSpan.FromHours(9));
string s = dto.ToString("yyyy-MM-ddTHH:mm:ss.fff zzz");
// 2026-02-10T20:15:30.000 +09:00
C#ポイントは、「書式文字列を“魔法の呪文”として覚えるのではなく、意味を理解して組み立てる」ことです。yyyy は年、MM は月、dd は日、HH は時…と分かっていれば、
新しいフォーマットも怖くなくなります。
実務でよく使うフォーマットパターン
画面表示用(人間が読む)
dt.ToString("yyyy/MM/dd HH:mm"); // 2026/02/10 20:15
dt.ToString("yyyy年M月d日 HH:mm"); // 2026年2月10日 20:15
dt.ToString("yyyy年M月d日(ddd) HH:mm"); // 2026年2月10日(火) 20:15
C#ddd は曜日(短縮形)です。
日本のカルチャなら「火」のように出ます。
ログ・API・システム間連携用(機械が読む)
DateTime utc = DateTime.UtcNow;
string iso = utc.ToString("yyyy-MM-ddTHH:mm:ss.fffZ");
// 2026-02-10T11:15:30.123Z など(UTCを表すZ付き)
string compact = utc.ToString("yyyyMMddHHmmss");
// 20260210111530
C#ISO 8601 形式(yyyy-MM-ddTHH:mm:ss.fffZ や yyyy-MM-ddTHH:mm:ss.fffK)は、
ログやAPIで非常によく使われる“お作法”です。
実務ユーティリティとしてまとめる
「用途ごとのフォーマット」を名前で表現する
あちこちで
dt.ToString("yyyy/MM/dd HH:mm");
dt.ToString("yyyy-MM-ddTHH:mm:ss.fffZ");
dt.ToString("yyyyMMdd");
C#と書いていると、
「これは画面用?ログ用?API用?」がコードから読み取りにくくなります。
そこで、用途ごとにメソッド名を付けたユーティリティにまとめると、
意図が一気に分かりやすくなります。
public static class DateFormatUtil
{
public static string ToDisplayDateTime(DateTime dt)
=> dt.ToString("yyyy/MM/dd HH:mm");
public static string ToDisplayDate(DateTime dt)
=> dt.ToString("yyyy/MM/dd");
public static string ToLogTimestampUtc(DateTime utc)
=> utc.ToString("yyyy-MM-ddTHH:mm:ss.fffZ");
public static string ToCompactTimestamp(DateTime dt)
=> dt.ToString("yyyyMMddHHmmss");
}
C#使い方はこうなります。
DateTime nowLocal = DateTime.Now;
DateTime nowUtc = DateTime.UtcNow;
Console.WriteLine(DateFormatUtil.ToDisplayDateTime(nowLocal)); // 2026/02/10 20:15
Console.WriteLine(DateFormatUtil.ToDisplayDate(nowLocal)); // 2026/02/10
Console.WriteLine(DateFormatUtil.ToLogTimestampUtc(nowUtc)); // 2026-02-10T11:15:30.123Z
Console.WriteLine(DateFormatUtil.ToCompactTimestamp(nowUtc)); // 20260210111530
C#「何のためのフォーマットか」がメソッド名に出ていることが、とても大事です。
これだけで、後から読む人の理解コストがかなり下がります。
ありがちな落とし穴と、その避け方
ToString() 引数なしに頼りすぎない
dt.ToString() と書くと、
実行環境のカルチャ(日本語OSなら日本形式、英語OSなら英語形式)に依存した文字列になります。
開発環境では 2026/02/10 20:15:30
本番サーバーでは 2/10/2026 8:15:30 PM
のように変わる可能性があります。
ログやファイル名、システム間連携など、
「機械が読む前提」の文字列には、必ず書式を明示するのが鉄則です。
MM と mm を間違えない
MM… 月(Month)mm… 分(minute)
これは本当によくやらかします。
dt.ToString("yyyy/mm/dd"); // 実は「年/分/日」になってしまう
月を出したいときは必ず MM。
「大文字が月、小文字が分」と体に叩き込んでおくといいです。
ローカルかUTCかを意識してフォーマットする
DateTime がローカルなのかUTCなのかを意識せずにフォーマットすると、
「日本時間のつもりがUTCだった」「9時間ずれていた」という事故につながります。
- 画面表示 → ローカルに変換してからフォーマット
- ログ・API → UTCのまま、UTCであることが分かるフォーマット(
Zやオフセット付き)
というように、「どの時間軸の値をフォーマットしているか」を意識するクセをつけておくと安全です。
まとめ 「日付フォーマットユーティリティ」は“時間の見せ方のルールブック”
日付フォーマットは、
「同じ日時を、用途に応じてどう見せるか」を決めるルールです。
押さえておきたいポイントは、
ToString("書式")で、yyyy/MM/dd/HH/mm/ssなどを組み合わせて自由にフォーマットできること。- 画面用・ログ用・API用など、用途ごとに“よく使うパターン”をユーティリティにまとめておくと、コードの意図が明確になること。
ToString()(書式なし)はカルチャ依存なので、機械が読む文字列には使わないほうがよいこと。MM(月)とmm(分)を間違えると、静かにおかしな文字列が出るので要注意なこと。- ローカル時間かUTCかを意識し、「どの時間軸の値をフォーマットしているか」を常に考えること。
ここを押さえておくと、
「とりあえず ToString している」状態から一歩進んで、
“人にも機械にも優しい、業務で使える日付フォーマットユーティリティ”を自分で設計できるようになります。
