【C#】DateTimeの書式指定:ToStringで日付と時刻を自由にフォーマットする方法

目次

日付と時刻の「書式(フォーマット)」

C#でDateTimeオブジェクト(特定の日時)を扱う際、そのままToString()で出力すると、実行環境のOS設定(カルチャ)に依存した標準的な文字列(例: 2025/11/20 14:30)が返されます。

しかし、ログ出力、API連携、UI表示など、用途に応じて「2025-11-20のようにハイフン区切りにしたい」、「木曜日のように曜日を含めたい」、「14:30:45.123のようにミリ秒まで表示したい」といった、特定の書式(フォーマット)に変換したいケースがほとんどです。

DateTimeオブジェクトのToString(string format)メソッドに「書式指定文字列」を渡すことで、これらの要求に柔軟に対応できます。書式指定には「標準」と「カスタム」の2種類があります。


標準の日時書式指定子

標準の書式指定子は、"d""F"のような単一のアルファベット文字で、一般的な形式を簡単に指定できるショートカットです。

重要な点として、"d"(短い日付)や"D"(長い日付)などの多くの指定子は、プログラムの実行環境のカルチャ(地域設定)に依存します。例えば、日本(ja-JP)ではyyyy/MM/dd、米国(en-US)ではM/d/yyyyとして解釈されます。

指定子名称ja-JPカルチャでの出力例 ( 2025/11/20 14:30:45 の場合)
d短い日付2025/11/20
D長い日付2025年11月20日
t短い時刻14:30
T長い時刻14:30:45
f完全 (短い時刻)2025年11月20日 14:30
F完全 (長い時刻)2025年11月20日 14:30:45
g一般 (短い時刻)2025/11/20 14:30
G一般 (長い時刻)2025/11/20 14:30:45
y or Y年月2025年11月
m or M月日11月20日
o or Oラウンドトリップ (ISO 8601)2025-11-20T14:30:45.0000000 (カルチャ非依存)
s並べ替え可能 (ISO 8601)2025-11-20T14:30:45 (カルチャ非依存)

コード例(標準指定子)

using System;
using System.Globalization;

public class StandardDateTimeFormat
{
    public static void Main()
    {
        // カルチャを 'ja-JP' (日本) に設定
        CultureInfo.CurrentCulture = new CultureInfo("ja-JP");

        DateTime sampleDate = new DateTime(2025, 11, 20, 14, 30, 45, 123);

        Console.WriteLine($"元のDateTime: {sampleDate}");
        Console.WriteLine("--- 標準の書式指定子 (ja-JP) ---");
        
        Console.WriteLine($"'d' (短い日付): {sampleDate.ToString("d")}");
        Console.WriteLine($"'D' (長い日付): {sampleDate.ToString("D")}");
        Console.WriteLine($"'T' (長い時刻): {sampleDate.ToString("T")}");
        Console.WriteLine($"'f' (完全): {sampleDate.ToString("f")}");

        // 'o' はカルチャ(地域設定)に依存しないため、
        // ログやAPI連携での使用が推奨されます。
        Console.WriteLine($"'o' (ISO 8601): {sampleDate.ToString("o")}");
    }
}

出力結果:

元のDateTime: 2025/11/20 14:30:45
--- 標準の書式指定子 (ja-JP) ---
'd' (短い日付): 2025/11/20
'D' (長い日付): 2025年11月20日
'T' (長い時刻): 14:30:45
'f' (完全): 2025年11月20日 14:30
'o' (ISO 8601): 2025-11-20T14:30:45.1230000

カスタム日時書式指定子

標準の書式指定子では対応できない、独自の形式(例: 2025-11-20 (木))で出力したい場合は、カスタム書式指定子を組み合わせて使用します。

指定子説明
yyyy4桁の年2025
yy2桁の年25
MM2桁の月(0埋め)01, 11
M1桁または2桁の月1, 11
dd2桁の日(0埋め)05, 20
d1桁または2桁の日5, 20
ddd曜日の省略名 (ja-JP), Thu (en-US)
dddd曜日の完全名木曜日 (ja-JP), Thursday (en-US)
HH24時間表記の時(0埋め)08, 14
H24時間表記の時8, 14
hh12時間表記の時(0埋め)02, 05 (午後2時 -> 02)
mm2桁の分(0埋め)05, 30
ss2桁の秒(0埋め)07, 45
fff3桁のミリ秒(0埋め)123
tt午前/午後 (AM/PM)午後 (ja-JP), PM (en-US)

注意: **M(月)m(分)**は、大文字と小文字で明確に区別されます。

コード例(カスタム指定子)

using System;
using System.Globalization;

public class CustomDateTimeFormat
{
    public static void Main()
    {
        CultureInfo.CurrentCulture = new CultureInfo("ja-JP");
        DateTime sampleDate = new DateTime(2025, 11, 20, 14, 30, 45, 123);

        Console.WriteLine("--- カスタム書式指定子 ---");
        
        // ログやファイル名で推奨される形式 (カルチャ非依存)
        string format1 = "yyyy-MM-dd_HH-mm-ss";
        Console.WriteLine($"'{format1}': {sampleDate.ToString(format1)}");

        // 日本語のUI表示形式
        string format2 = "yyyy年M月d日 (dddd) tt hh時mm分";
        Console.WriteLine($"'{format2}': {sampleDate.ToString(format2)}");

        // ミリ秒を含む形式
        string format3 = "HH:mm:ss.fff";
        Console.WriteLine($"'{format3}': {sampleDate.ToString(format3)}");
    }
}

出力結果:

--- カスタム書式指定子 ---
'yyyy-MM-dd_HH-mm-ss': 2025-11-20_14-30-45
'yyyy年M月d日 (dddd) tt hh時mm分': 2025年11月20日 (木曜日) 午後 02時30分
'HH:mm:ss.fff': 14:30:45.123

補足:カルチャの明示的な指定

ToString()メソッドは、引数としてCultureInfo(カルチャ情報)を受け取ることができます。これにより、OSの地域設定に関わらず、特定の言語(例: en-US)の書式で出力できます。

DateTime sampleDate = new DateTime(2025, 11, 20);
var usCulture = new CultureInfo("en-US");

// 'D' (長い日付) を en-US 形式で出力
Console.WriteLine(sampleDate.ToString("D", usCulture)); 
// 出力: Thursday, November 20, 2025

まとめ

DateTimeを文字列に変換する際は、ToString()メソッドに書式指定子を渡すことで、出力を自由に制御できます。

  • 標準指定子 (“d”, “F”など):一般的な形式を素早く指定できますが、多くはカルチャ(地域設定)に依存します。
  • カスタム指定子 (“yyyy-MM-dd”など):y, M, d, H, m, s などを組み合わせて、独自の書式を正確に定義できます。
  • カルチャ非依存の書式 (“o”, “s”):ログ、ファイル名、API連携など、機械が読み取るデータには、カルチャに依存しないISO 8601形式(”o”や”s”、または”yyyy-MM-ddTHH:mm:ss”)を使用することが強く推奨されます。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次