日付と時刻の「書式(フォーマット)」
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 (木))で出力したい場合は、カスタム書式指定子を組み合わせて使用します。
| 指定子 | 説明 | 例 |
yyyy | 4桁の年 | 2025 |
yy | 2桁の年 | 25 |
MM | 2桁の月(0埋め) | 01, 11 |
M | 1桁または2桁の月 | 1, 11 |
dd | 2桁の日(0埋め) | 05, 20 |
d | 1桁または2桁の日 | 5, 20 |
ddd | 曜日の省略名 | 木 (ja-JP), Thu (en-US) |
dddd | 曜日の完全名 | 木曜日 (ja-JP), Thursday (en-US) |
HH | 24時間表記の時(0埋め) | 08, 14 |
H | 24時間表記の時 | 8, 14 |
hh | 12時間表記の時(0埋め) | 02, 05 (午後2時 -> 02) |
mm | 2桁の分(0埋め) | 05, 30 |
ss | 2桁の秒(0埋め) | 07, 45 |
fff | 3桁のミリ秒(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”)を使用することが強く推奨されます。
