C# Tips | 日付・時間処理:日付フォーマット

C# C#
スポンサーリンク

はじめに 「日付フォーマット」は“人間に読める形に整える”最後の仕上げ

業務システムでは、DBや内部処理では DateTime / DateTimeOffset のまま扱い、
画面・CSV・ログ・帳票などに出すときに「文字列」に変換します。
この「日時 → 文字列」の変換ルールが 日付フォーマット です。

同じ日時でも、

  • 2026/02/10 20:15
  • 2026-02-10T20:15:00
  • 2026年2月10日(火) 20時15分
  • 20260210

など、用途によって“正解の形”が変わります。
だからこそ、フォーマットをユーティリティとして整理しておくと、業務コードが一気に読みやすく・安全になります。

ここから、
基本の書き方 → よく使うフォーマット → 実務ユーティリティ化 → ありがちな落とし穴
の順にかみ砕いて説明していきます。


基本:ToString("書式") で日付を文字列にする

一番シンプルな形

C# では、DateTimeDateTimeOffset に対して 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.fffZyyyy-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 している」状態から一歩進んで、
“人にも機械にも優しい、業務で使える日付フォーマットユーティリティ”を自分で設計できるようになります。

タイトルとURLをコピーしました