C# DateTimeのFormat完全ガイド|日時の表示形式・変換・よくあるエラーをサンプル付きで解説
はじめに
C#で日時を扱うとき、多くの場面で必要になるのがDateTimeのFormat、つまり日時の表示形式や文字列変換です。
たとえば、同じDateTimeの値でも、画面には次のようにさまざまな形式で表示できます。
C#DateTime now = new DateTime(2026, 6, 6, 14, 5, 9);
Console.WriteLine(now.ToString("yyyy/MM/dd")); // 2026/06/06
Console.WriteLine(now.ToString("yyyy-MM-dd")); // 2026-06-06
Console.WriteLine(now.ToString("yyyy年MM月dd日")); // 2026年06月06日
Console.WriteLine(now.ToString("HH:mm:ss")); // 14:05:09
Console.WriteLine(now.ToString("yyyyMMddHHmmss")); // 20260606140509
一方で、DateTimeのFormatは単なる表示だけではありません。文字列をDateTime型に変換するときにも、Parse、TryParse、ParseExact、TryParseExactなどで書式を意識する必要があります。
特に実務では、次のようなトラブルがよく起こります。
C#// MMとmmを間違えて、月ではなく分が表示される
Console.WriteLine(now.ToString("yyyy/mm/dd")); // 2026/05/06 のような意図しない結果
// HHとhhを間違えて、24時間表記にならない
Console.WriteLine(now.ToString("yyyy/MM/dd hh:mm:ss")); // 02:05:09
// ParseExactで指定した形式と入力文字列が一致せず例外になる
DateTime.ParseExact("2026/06/06", "yyyy-MM-dd", null);
この記事では、C#のDateTime Formatについて、基本構文、よく使う書式、標準書式指定子、カスタム書式指定子、文字列からの変換、CultureInfo、UTC、DateTimeOffset、エラー対策、実務サンプルまでまとめて解説します。
1. C# DateTimeのFormatとは?まず押さえる基本
C#におけるDateTimeのFormatとは、DateTime型の日時データを、目的に応じた文字列形式で表現するための書式指定のことです。
DateTimeそのものは日時の値を表す型であり、「2026/06/06」という文字列を保持しているわけではありません。表示するとき、ファイル名に使うとき、ログに出すとき、APIで送信するときなどに、はじめて文字列形式へ変換します。
代表的な書き方は次のとおりです。
C#DateTime now = DateTime.Now;
string text = now.ToString("yyyy/MM/dd HH:mm:ss");
Console.WriteLine(text);
DateTime.ToString(String)は、指定したFormatに従って日時を文字列化します。また、Formatの指定には標準書式指定子とカスタム書式指定子があります。標準書式指定子は"d"や"G"のような1文字の指定、カスタム書式指定子は"yyyy/MM/dd"のように複数の記号を組み合わせる指定です。Microsoft Learnでも、標準の日付と時刻書式文字列は1文字の指定子を使い、複数文字のFormatはカスタム書式文字列として解釈されると説明されています。
1-1. DateTimeのFormatでできること
DateTimeのFormatを使うと、日時をさまざまな形式で表示できます。
C#DateTime date = new DateTime(2026, 6, 6, 9, 8, 7);
Console.WriteLine(date.ToString("yyyy/MM/dd")); // 2026/06/06
Console.WriteLine(date.ToString("yyyy-MM-dd")); // 2026-06-06
Console.WriteLine(date.ToString("yyyy年M月d日")); // 2026年6月6日
Console.WriteLine(date.ToString("HH:mm:ss")); // 09:08:07
Console.WriteLine(date.ToString("yyyyMMddHHmmss")); // 20260606090807
実務では、用途によって適切なFormatが異なります。
画面表示では、ユーザーが読みやすいyyyy/MM/ddやyyyy年M月d日がよく使われます。ログでは、並べ替えしやすいyyyy-MM-dd HH:mm:ss.fffが便利です。ファイル名では、/や:を含めないyyyyMMddHHmmssがよく使われます。APIやJSONでは、ISO 8601形式を使うことが多いです。
重要なのは、Formatは「日時の値そのもの」を変えるものではなく、「日時をどう文字列として見せるか」を決めるものだという点です。
1-2. 「表示形式の変更」と「文字列から日時への変換」の違い
C#のDateTime Formatを理解するときは、次の2つを分けて考える必要があります。
1つ目は、DateTimeをstringに変換する処理です。
C#DateTime date = new DateTime(2026, 6, 6);
string text = date.ToString("yyyy/MM/dd");
Console.WriteLine(text); // 2026/06/06
これは「日時を表示用の文字列にする」処理です。
2つ目は、stringをDateTimeに変換する処理です。
C#string text = "2026/06/06";
DateTime date = DateTime.ParseExact(
text,
"yyyy/MM/dd",
System.Globalization.CultureInfo.InvariantCulture
);
Console.WriteLine(date);
これは「文字列を日時データとして解釈する」処理です。
つまり、方向が逆です。
C#DateTime → string // ToStringでFormatする
string → DateTime // ParseやParseExactで変換する
この違いを混同すると、「FormatしたのにDateTimeの中身が変わらない」「Parseしたのに期待した表示にならない」といった混乱が起こります。
1-3. DateTime.ToStringで日時を好きな形式に整形する基本構文
DateTime.ToStringの基本構文は次のとおりです。
C#DateTime date = DateTime.Now;
string result = date.ToString("書式文字列");
たとえば、年月日をスラッシュ区切りで表示するなら次のように書きます。
C#DateTime date = new DateTime(2026, 6, 6);
string result = date.ToString("yyyy/MM/dd");
Console.WriteLine(result); // 2026/06/06
時分秒まで表示する場合は、次のようにします。
C#DateTime date = new DateTime(2026, 6, 6, 14, 30, 15);
string result = date.ToString("yyyy/MM/dd HH:mm:ss");
Console.WriteLine(result); // 2026/06/06 14:30:15
ToString(String)は、指定されたFormatに基づいて日時を文字列として返します。Formatを省略した場合やnullまたは空文字を指定した場合は、一般的な日付と時刻の書式指定子Gが使われます。
1-4. DateTime型とstring型を混同しないための考え方
DateTimeとstringはまったく別の型です。
DateTimeは日時の値を扱うための型です。日付の比較、加算、減算、期間計算などに使えます。
C#DateTime start = new DateTime(2026, 6, 1);
DateTime end = new DateTime(2026, 6, 6);
TimeSpan span = end - start;
Console.WriteLine(span.Days); // 5
一方、stringは文字列です。表示や出力には向いていますが、日時計算には向いていません。
C#string dateText = "2026/06/06";
実務では、内部処理ではできるだけDateTime型のまま扱い、画面表示やファイル出力、ログ出力、API送信などの直前でstringにFormatするのが基本です。
悪い例は、早い段階で文字列に変換してしまうことです。
C#// あまりよくない例
string orderDate = DateTime.Now.ToString("yyyy/MM/dd");
このようにすると、あとから日付計算やタイムゾーン変換が必要になったときに扱いづらくなります。
よい例は、日時はDateTimeとして保持し、表示時だけFormatすることです。
C#// よい例
DateTime orderDate = DateTime.Now;
Console.WriteLine(orderDate.ToString("yyyy/MM/dd"));
2. よく使うC# DateTime Format早見表
ここでは、実務でよく使うDateTime Formatを一覧で紹介します。
C#DateTime date = new DateTime(2026, 6, 6, 14, 5, 9, 123);
| 用途 | Format | 出力例 |
|---|---|---|
| 日付表示 | yyyy/MM/dd | 2026/06/06 |
| ISO風の日付 | yyyy-MM-dd | 2026-06-06 |
| 日本語の日付 | yyyy年MM月dd日 | 2026年06月06日 |
| 時刻 | HH:mm:ss | 14:05:09 |
| 日時 | yyyy/MM/dd HH:mm:ss | 2026/06/06 14:05:09 |
| ファイル名向け | yyyyMMddHHmmss | 20260606140509 |
| ミリ秒付き | yyyy/MM/dd HH:mm:ss.fff | 2026/06/06 14:05:09.123 |
| 曜日付き | yyyy/MM/dd dddd | 2026/06/06 土曜日 |
| ISO 8601形式 | o | 2026-06-06T14:05:09.1230000 |
2-1. yyyy/MM/dd形式で表示する
日本の業務システムでよく使われるのがyyyy/MM/dd形式です。
C#DateTime date = new DateTime(2026, 6, 6);
string result = date.ToString("yyyy/MM/dd");
Console.WriteLine(result); // 2026/06/06
yyyyは4桁の年、MMは2桁の月、ddは2桁の日を表します。
月や日が1桁の場合でも、06のようにゼロ埋めされます。
C#DateTime date = new DateTime(2026, 1, 5);
Console.WriteLine(date.ToString("yyyy/MM/dd")); // 2026/01/05
ゼロ埋めしたくない場合は、Mやdを使います。
C#Console.WriteLine(date.ToString("yyyy/M/d")); // 2026/1/5
2-2. yyyy-MM-dd形式で表示する
yyyy-MM-ddは、日付をハイフン区切りで表示する形式です。
C#DateTime date = new DateTime(2026, 6, 6);
string result = date.ToString("yyyy-MM-dd");
Console.WriteLine(result); // 2026-06-06
データ連携、CSV、API、データベースの確認用表示などでよく使われます。
日付順に並べ替えたときにも自然にソートしやすい形式です。
C#var dates = new[]
{
new DateTime(2026, 12, 1),
new DateTime(2026, 1, 10),
new DateTime(2026, 6, 6)
};
foreach (var d in dates.OrderBy(x => x))
{
Console.WriteLine(d.ToString("yyyy-MM-dd"));
}
出力例は次のとおりです。
2026-01-10
2026-06-06
2026-12-01
2-3. yyyy年MM月dd日形式で表示する
ユーザー向けの画面や帳票では、yyyy年MM月dd日のような日本語形式が読みやすいです。
C#DateTime date = new DateTime(2026, 6, 6);
string result = date.ToString("yyyy年MM月dd日");
Console.WriteLine(result); // 2026年06月06日
ゼロ埋めが不要な場合は、Mとdを使います。
C#DateTime date = new DateTime(2026, 1, 5);
Console.WriteLine(date.ToString("yyyy年M月d日")); // 2026年1月5日
請求書や帳票などでは、ゼロ埋めなしのyyyy年M月d日のほうが自然に見えることもあります。
2-4. HH:mm:ss形式で時刻を表示する
時刻だけを表示したい場合は、HH:mm:ssを使います。
C#DateTime date = new DateTime(2026, 6, 6, 14, 5, 9);
string result = date.ToString("HH:mm:ss");
Console.WriteLine(result); // 14:05:09
HHは24時間表記の時、mmは分、ssは秒です。
午前9時5分7秒のような時刻も、2桁で表示されます。
C#DateTime date = new DateTime(2026, 6, 6, 9, 5, 7);
Console.WriteLine(date.ToString("HH:mm:ss")); // 09:05:07
ゼロ埋めをしたくない場合、時はHを使えます。
C#Console.WriteLine(date.ToString("H:mm:ss")); // 9:05:07
2-5. yyyy/MM/dd HH:mm:ss形式で日時を表示する
日付と時刻をまとめて表示する場合は、yyyy/MM/dd HH:mm:ssがよく使われます。
C#DateTime date = new DateTime(2026, 6, 6, 14, 5, 9);
string result = date.ToString("yyyy/MM/dd HH:mm:ss");
Console.WriteLine(result); // 2026/06/06 14:05:09
管理画面、一覧画面、更新日時、登録日時などでよく使うFormatです。
C#DateTime createdAt = DateTime.Now;
Console.WriteLine($"登録日時: {createdAt:yyyy/MM/dd HH:mm:ss}");
文字列補間を使う場合は、{変数:Format}のように書けます。
C#Console.WriteLine($"{createdAt:yyyy/MM/dd HH:mm:ss}");
2-6. yyyyMMddHHmmss形式でファイル名やID向けに表示する
ファイル名や一時IDに日時を含めたい場合は、yyyyMMddHHmmssが便利です。
C#DateTime now = new DateTime(2026, 6, 6, 14, 5, 9);
string timestamp = now.ToString("yyyyMMddHHmmss");
Console.WriteLine(timestamp); // 20260606140509
ファイル名に使う例です。
C#DateTime now = DateTime.Now;
string fileName = $"backup_{now:yyyyMMddHHmmss}.csv";
Console.WriteLine(fileName);
出力例は次のようになります。
backup_20260606140509.csv
Windowsのファイル名では:や/が使えないため、yyyy/MM/dd HH:mm:ssのようなFormatをそのままファイル名に使うのは避けましょう。
C#// ファイル名には不向き
string badFileName = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
// ファイル名に向いている
string goodFileName = DateTime.Now.ToString("yyyyMMddHHmmss");
2-7. ミリ秒まで表示する
ミリ秒まで表示したい場合は、fffを使います。
C#DateTime date = new DateTime(2026, 6, 6, 14, 5, 9, 123);
string result = date.ToString("yyyy/MM/dd HH:mm:ss.fff");
Console.WriteLine(result); // 2026/06/06 14:05:09.123
ログ出力や処理時間の調査では、ミリ秒があると便利です。
C#Console.WriteLine($"Start: {DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}");
fの数によって、表示する秒の小数部の桁数が変わります。カスタム日時書式では、fやFを使って秒の小数部を表現できます。
C#DateTime date = new DateTime(2026, 6, 6, 14, 5, 9, 123);
Console.WriteLine(date.ToString("HH:mm:ss.f")); // 14:05:09.1
Console.WriteLine(date.ToString("HH:mm:ss.ff")); // 14:05:09.12
Console.WriteLine(date.ToString("HH:mm:ss.fff")); // 14:05:09.123
2-8. 曜日を表示する
曜日を表示する場合は、dddまたはddddを使います。
C#DateTime date = new DateTime(2026, 6, 6);
Console.WriteLine(date.ToString("yyyy/MM/dd ddd")); // 2026/06/06 土
Console.WriteLine(date.ToString("yyyy/MM/dd dddd")); // 2026/06/06 土曜日
日本語の曜日にしたい場合は、CultureInfoを指定すると明確です。
C#using System.Globalization;
DateTime date = new DateTime(2026, 6, 6);
CultureInfo culture = new CultureInfo("ja-JP");
Console.WriteLine(date.ToString("yyyy/MM/dd dddd", culture));
// 2026/06/06 土曜日
英語の曜日にしたい場合は、en-USなどを指定します。
C#using System.Globalization;
DateTime date = new DateTime(2026, 6, 6);
CultureInfo culture = new CultureInfo("en-US");
Console.WriteLine(date.ToString("yyyy/MM/dd dddd", culture));
// 2026/06/06 Saturday
2-9. ISO 8601形式で表示する
システム間連携やAPIでは、ISO 8601形式がよく使われます。
DateTimeでは、標準書式指定子"o"を使うとラウンドトリップ形式で出力できます。
C#DateTime date = new DateTime(2026, 6, 6, 14, 5, 9, DateTimeKind.Utc);
string result = date.ToString("o");
Console.WriteLine(result);
出力例は次のようになります。
2026-06-06T14:05:09.0000000Z
"o"はラウンドトリップ形式の標準書式指定子です。標準の日付と時刻書式指定子として、DateTimeやDateTimeOffsetなどの文字列表現に使用できます。
DateTimeOffsetを使うと、タイムゾーンオフセットを含めて表現できます。
C#DateTimeOffset dto = new DateTimeOffset(2026, 6, 6, 14, 5, 9, TimeSpan.FromHours(9));
Console.WriteLine(dto.ToString("o"));
// 2026-06-06T14:05:09.0000000+09:00
3. DateTime.ToStringで使う標準書式指定子
DateTime.ToStringでは、"d"、"D"、"t"、"T"、"f"、"F"、"g"、"G"、"o"、"s"などの標準書式指定子が使えます。
標準書式指定子は、短く書けるのがメリットです。
C#DateTime date = new DateTime(2026, 6, 6, 14, 5, 9);
Console.WriteLine(date.ToString("d"));
Console.WriteLine(date.ToString("D"));
Console.WriteLine(date.ToString("T"));
Console.WriteLine(date.ToString("G"));
ただし、標準書式指定子の出力はカルチャの影響を受けるものがあります。ja-JPとen-USでは表示が変わることがあるため、固定形式が必要な場合はカスタム書式やInvariantCultureを使うのが安全です。
3-1. 標準書式指定子とは
標準書式指定子とは、1文字で定義された日付と時刻のFormatです。
たとえば、次のように使います。
C#DateTime date = new DateTime(2026, 6, 6, 14, 5, 9);
Console.WriteLine(date.ToString("d")); // 短い日付形式
Console.WriteLine(date.ToString("D")); // 長い日付形式
Console.WriteLine(date.ToString("t")); // 短い時刻形式
Console.WriteLine(date.ToString("T")); // 長い時刻形式
標準書式指定子は1文字である点が重要です。"d"は標準書式指定子ですが、"yyyy/MM/dd"はカスタム書式指定子です。
また、"d"のような単体の指定と、"yyyy/M/d"の中にあるdでは意味の扱われ方が変わる点にも注意しましょう。
C#DateTime date = new DateTime(2026, 6, 6);
Console.WriteLine(date.ToString("d")); // 標準書式指定子
Console.WriteLine(date.ToString("yyyy/M/d")); // カスタム書式指定子
3-2. d:短い日付形式
"d"は短い日付形式です。
C#DateTime date = new DateTime(2026, 6, 6, 14, 5, 9);
Console.WriteLine(date.ToString("d"));
日本語環境では、次のような形式になることがあります。
2026/06/06
ただし、出力は現在のカルチャに依存します。DateTime.ToString(String)は、現在のカルチャの書式設定規則を使って文字列を返します。
カルチャを明示する例です。
C#using System.Globalization;
DateTime date = new DateTime(2026, 6, 6);
Console.WriteLine(date.ToString("d", new CultureInfo("ja-JP")));
Console.WriteLine(date.ToString("d", new CultureInfo("en-US")));
3-3. D:長い日付形式
"D"は長い日付形式です。
C#DateTime date = new DateTime(2026, 6, 6);
Console.WriteLine(date.ToString("D"));
日本語環境では、次のような表示になります。
2026年6月6日
英語環境では、次のような表示になります。
C#using System.Globalization;
DateTime date = new DateTime(2026, 6, 6);
Console.WriteLine(date.ToString("D", new CultureInfo("en-US")));
出力例です。
Saturday, June 6, 2026
ユーザーの言語に合わせて自然な日付表示をしたい場合に便利です。
3-4. t:短い時刻形式
"t"は短い時刻形式です。
C#DateTime date = new DateTime(2026, 6, 6, 14, 5, 9);
Console.WriteLine(date.ToString("t"));
出力はカルチャに依存します。
14:05
または英語圏では次のように表示される場合があります。
2:05 PM
固定で24時間表記にしたい場合は、標準書式指定子ではなくカスタム書式指定子を使います。
C#Console.WriteLine(date.ToString("HH:mm")); // 14:05
3-5. T:長い時刻形式
"T"は長い時刻形式です。
C#DateTime date = new DateTime(2026, 6, 6, 14, 5, 9);
Console.WriteLine(date.ToString("T"));
日本語環境では、次のように秒まで表示されます。
14:05:09
秒まで含めた時刻表示を、カルチャに合わせて出したい場合に便利です。
固定形式にしたい場合は、次のように書きます。
C#Console.WriteLine(date.ToString("HH:mm:ss")); // 14:05:09
3-6. f/F:日付と時刻を表示する形式
"f"は長い日付と短い時刻を表示します。
C#DateTime date = new DateTime(2026, 6, 6, 14, 5, 9);
Console.WriteLine(date.ToString("f"));
"F"は長い日付と長い時刻を表示します。
C#Console.WriteLine(date.ToString("F"));
イメージとしては、"f"は秒なし、"F"は秒ありの日時表示です。
2026年6月6日 14:05
2026年6月6日 14:05:09
ただし、実際の表示はカルチャによって変わります。
3-7. g/G:一般的な日付と時刻の形式
"g"は一般的な短い日付と短い時刻の形式です。
C#DateTime date = new DateTime(2026, 6, 6, 14, 5, 9);
Console.WriteLine(date.ToString("g"));
"G"は一般的な短い日付と長い時刻の形式です。
C#Console.WriteLine(date.ToString("G"));
ToString()でFormatを省略した場合も、一般的な形式で表示されます。
C#Console.WriteLine(date.ToString());
ただし、ログやAPIのように形式を固定したい場面では、"G"に頼るよりも"yyyy-MM-dd HH:mm:ss"や"o"を明示したほうが安全です。
3-8. o:ラウンドトリップ形式
"o"はラウンドトリップ形式です。
C#DateTime utc = new DateTime(2026, 6, 6, 14, 5, 9, DateTimeKind.Utc);
Console.WriteLine(utc.ToString("o"));
出力例です。
2026-06-06T14:05:09.0000000Z
DateTimeOffsetでも使えます。
C#DateTimeOffset dto = new DateTimeOffset(2026, 6, 6, 14, 5, 9, TimeSpan.FromHours(9));
Console.WriteLine(dto.ToString("o"));
出力例です。
2026-06-06T14:05:09.0000000+09:00
API、JSON、ログ、システム間連携など、日時の意味を失いたくない場面で使いやすいFormatです。
3-9. s:ソート可能な日時形式
"s"はソート可能な日時形式です。
C#DateTime date = new DateTime(2026, 6, 6, 14, 5, 9);
Console.WriteLine(date.ToString("s"));
出力例です。
2026-06-06T14:05:09
年月日、時分秒の順に並ぶため、文字列として並べ替えたときにも日時順になりやすい形式です。
ただし、"s"にはタイムゾーン情報が含まれません。UTCやオフセットを明確に扱いたい場合は、"o"やDateTimeOffsetを検討しましょう。
3-10. 標準書式指定子を使うべきケース
標準書式指定子は、次のような場面に向いています。
ユーザーの言語や地域設定に合わせて自然に表示したい場合は、"d"、"D"、"t"、"T"が便利です。
C#Console.WriteLine(date.ToString("D", CultureInfo.CurrentCulture));
システム間で日時を正確に往復させたい場合は、"o"が便利です。
C#string text = date.ToString("o");
DateTime restored = DateTime.Parse(text, null, DateTimeStyles.RoundtripKind);
一方で、画面仕様やCSV仕様で「必ずyyyy/MM/ddにする」と決まっている場合は、標準書式指定子ではなくカスタム書式指定子を使いましょう。
C#Console.WriteLine(date.ToString("yyyy/MM/dd"));
4. カスタム書式指定子の使い方
カスタム書式指定子を使うと、日時を自由な形式で表示できます。
C#DateTime date = new DateTime(2026, 6, 6, 14, 5, 9, 123);
Console.WriteLine(date.ToString("yyyy/MM/dd HH:mm:ss.fff"));
出力例です。
2026/06/06 14:05:09.123
カスタム書式指定子は、実務で最もよく使うDateTime Formatです。
4-1. カスタム書式指定子とは
カスタム書式指定子とは、yyyy、MM、dd、HH、mm、ssなどを組み合わせて、任意の日時形式を作る指定方法です。
C#DateTime date = new DateTime(2026, 6, 6, 14, 5, 9);
Console.WriteLine(date.ToString("yyyy/MM/dd"));
Console.WriteLine(date.ToString("yyyy-MM-dd HH:mm:ss"));
Console.WriteLine(date.ToString("yyyy年M月d日 H時m分"));
出力例です。
2026/06/06
2026-06-06 14:05:09
2026年6月6日 14時5分
Microsoft Learnでは、カスタム日時書式文字列はDateTimeやDateTimeOffsetを文字列表現へ変換するため、または解析時に期待する文字列表現を定義するために使えると説明されています。
4-2. yyyy/yy:年の表示
年を表示するには、yyyyまたはyyを使います。
C#DateTime date = new DateTime(2026, 6, 6);
Console.WriteLine(date.ToString("yyyy")); // 2026
Console.WriteLine(date.ToString("yy")); // 26
通常は4桁のyyyyを使うのがおすすめです。
C#Console.WriteLine(date.ToString("yyyy/MM/dd")); // 2026/06/06
yyは2桁の年になるため、長期運用するシステムやデータ保存には不向きな場合があります。
C#Console.WriteLine(date.ToString("yy/MM/dd")); // 26/06/06
特別な理由がなければ、年はyyyyを使いましょう。
4-3. MM/M:月の表示
月を表示するには、MMまたはMを使います。
C#DateTime date = new DateTime(2026, 1, 5);
Console.WriteLine(date.ToString("MM")); // 01
Console.WriteLine(date.ToString("M")); // 1
MMは2桁ゼロ埋め、Mはゼロ埋めなしです。
C#Console.WriteLine(date.ToString("yyyy/MM/dd")); // 2026/01/05
Console.WriteLine(date.ToString("yyyy/M/d")); // 2026/1/5
画面や帳票ではM、固定長の文字列やファイル名ではMMがよく使われます。
4-4. dd/d:日の表示
日を表示するには、ddまたはdを使います。
C#DateTime date = new DateTime(2026, 1, 5);
Console.WriteLine(date.ToString("dd")); // 05
Console.WriteLine(date.ToString("d")); // 5
ddは2桁ゼロ埋め、dはゼロ埋めなしです。
C#Console.WriteLine(date.ToString("yyyy年MM月dd日")); // 2026年01月05日
Console.WriteLine(date.ToString("yyyy年M月d日")); // 2026年1月5日
注意点として、date.ToString("d")のようにdだけを指定した場合は標準書式指定子の短い日付形式として扱われます。一方、"yyyy/M/d"の中のdはカスタム書式指定子の日として扱われます。
4-5. HH/hh:24時間表記と12時間表記の違い
時を表示するには、HHまたはhhを使います。
HHは24時間表記です。
C#DateTime date = new DateTime(2026, 6, 6, 14, 5, 9);
Console.WriteLine(date.ToString("HH:mm:ss")); // 14:05:09
hhは12時間表記です。
C#Console.WriteLine(date.ToString("hh:mm:ss")); // 02:05:09
12時間表記を使う場合は、午前・午後を示すttも一緒に使うとわかりやすいです。
C#Console.WriteLine(date.ToString("tt hh:mm:ss", new CultureInfo("ja-JP")));
// 午後 02:05:09
実務では、ログやデータ連携ではHHを使うことが多いです。hhだけだと午前と午後の区別がつかなくなるため注意しましょう。
4-6. mm:分の表示
分を表示するには、mmを使います。
C#DateTime date = new DateTime(2026, 6, 6, 14, 5, 9);
Console.WriteLine(date.ToString("HH:mm")); // 14:05
ここで非常によくあるミスが、月のMMと分のmmを間違えることです。
C#DateTime date = new DateTime(2026, 6, 6, 14, 5, 9);
Console.WriteLine(date.ToString("yyyy/mm/dd")); // 間違い
Console.WriteLine(date.ToString("yyyy/MM/dd")); // 正しい
yyyy/mm/ddと書くと、mmは月ではなく分として扱われます。
そのため、意図しない結果になります。
2026/05/06
月は大文字のMM、分は小文字のmmと覚えましょう。
4-7. ss:秒の表示
秒を表示するには、ssを使います。
C#DateTime date = new DateTime(2026, 6, 6, 14, 5, 9);
Console.WriteLine(date.ToString("HH:mm:ss")); // 14:05:09
ゼロ埋めなしにしたい場合は、sを使います。
C#Console.WriteLine(date.ToString("H:m:s")); // 14:5:9
ただし、時刻表示では桁が揃っているほうが読みやすいため、通常はHH:mm:ssを使うことが多いです。
4-8. fff:ミリ秒の表示
ミリ秒を表示するには、fffを使います。
C#DateTime date = new DateTime(2026, 6, 6, 14, 5, 9, 123);
Console.WriteLine(date.ToString("HH:mm:ss.fff")); // 14:05:09.123
ログでは、次のようなFormatがよく使われます。
C#Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
出力例です。
2026-06-06 14:05:09.123
より高い精度を含めたい場合は、fffffffのように桁数を増やすこともできます。
C#Console.WriteLine(date.ToString("HH:mm:ss.fffffff"));
4-9. tt:AM/PMの表示
ttはAM/PM、または午前/午後の表示に使います。
C#using System.Globalization;
DateTime date = new DateTime(2026, 6, 6, 14, 5, 9);
Console.WriteLine(date.ToString("tt hh:mm", new CultureInfo("ja-JP")));
// 午後 02:05
Console.WriteLine(date.ToString("tt hh:mm", new CultureInfo("en-US")));
// PM 02:05
12時間表記のhhを使う場合は、ttも一緒に使うのがおすすめです。
C#Console.WriteLine(date.ToString("hh:mm")); // 02:05
Console.WriteLine(date.ToString("tt hh:mm")); // 午後 02:05
ttを付けないと、午前2時なのか午後2時なのか判断できません。
4-10. ddd/dddd:曜日の表示
曜日を短く表示するにはddd、長く表示するにはddddを使います。
C#using System.Globalization;
DateTime date = new DateTime(2026, 6, 6);
CultureInfo ja = new CultureInfo("ja-JP");
Console.WriteLine(date.ToString("ddd", ja)); // 土
Console.WriteLine(date.ToString("dddd", ja)); // 土曜日
英語表示にする場合は、en-USを指定します。
C#CultureInfo en = new CultureInfo("en-US");
Console.WriteLine(date.ToString("ddd", en)); // Sat
Console.WriteLine(date.ToString("dddd", en)); // Saturday
画面表示で曜日を付けたい場合は、次のように書けます。
C#Console.WriteLine(date.ToString("yyyy年M月d日 dddd", ja));
// 2026年6月6日 土曜日
4-11. よく間違える大文字・小文字の違い
DateTime Formatでは、大文字と小文字が重要です。
| 指定子 | 意味 |
|---|---|
yyyy | 4桁の年 |
yy | 2桁の年 |
MM | 月 |
mm | 分 |
dd | 日 |
HH | 24時間表記の時 |
hh | 12時間表記の時 |
ss | 秒 |
fff | ミリ秒 |
tt | AM/PM、午前/午後 |
ddd | 短い曜日 |
dddd | 長い曜日 |
特に多い間違いは、MMとmmです。
C#DateTime date = new DateTime(2026, 6, 6, 14, 5, 9);
Console.WriteLine(date.ToString("yyyy/mm/dd")); // 2026/05/06
Console.WriteLine(date.ToString("yyyy/MM/dd")); // 2026/06/06
次に多いのが、HHとhhです。
C#Console.WriteLine(date.ToString("HH:mm")); // 14:05
Console.WriteLine(date.ToString("hh:mm")); // 02:05
また、年にはyyyyを使います。YYYYはC#のDateTimeで通常の年を表す指定として使いません。
C#Console.WriteLine(date.ToString("yyyy-MM-dd")); // 正しい
Console.WriteLine(date.ToString("YYYY-MM-dd")); // 意図した結果にならない
他の言語やライブラリの書式と混同しないようにしましょう。
5. 文字列をDateTimeに変換する方法
DateTime Formatは、表示だけでなく、文字列をDateTimeに変換する場面でも重要です。
代表的なメソッドは次の4つです。
| メソッド | 特徴 |
|---|---|
DateTime.Parse | 文字列を日時に変換する。失敗すると例外 |
DateTime.TryParse | 変換できるか試す。失敗しても例外を投げない |
DateTime.ParseExact | 指定したFormatに厳密一致する文字列だけ変換 |
DateTime.TryParseExact | 厳密変換を安全に試す |
ユーザー入力、CSV、外部API、ログファイルなどから日時文字列を受け取る場合は、失敗時に例外を投げないTryParseやTryParseExactを使うのが実務では安全です。
5-1. DateTime.Parseの基本
DateTime.Parseは、文字列をDateTimeに変換します。
C#string text = "2026/06/06";
DateTime date = DateTime.Parse(text);
Console.WriteLine(date);
簡単に使える一方で、実行環境のカルチャや入力形式によって解釈が変わる場合があります。
C#string text = "01/02/2026";
DateTime date = DateTime.Parse(text);
Console.WriteLine(date);
この文字列は、日本では「2026年1月2日」と解釈される可能性があり、米国形式では「2026年1月2日」または別の解釈が絡む形式設計になることがあります。曖昧な形式は避けるべきです。
固定形式の文字列を扱う場合は、ParseExactを使うほうが安全です。
5-2. DateTime.TryParseで例外を避けて変換する
DateTime.TryParseは、変換に成功したかどうかをboolで返します。
C#string text = "2026/06/06";
if (DateTime.TryParse(text, out DateTime date))
{
Console.WriteLine($"変換成功: {date}");
}
else
{
Console.WriteLine("変換失敗");
}
不正な文字列でも例外が発生しないため、ユーザー入力のチェックに向いています。
C#string text = "abc";
if (DateTime.TryParse(text, out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("日付として正しくありません");
}
ただし、TryParseは柔軟に解釈しようとするため、「想定外の形式でも変換できてしまう」場合があります。入力Formatが決まっている場合は、TryParseExactを使いましょう。
5-3. DateTime.ParseExactで指定したFormatに厳密変換する
DateTime.ParseExactは、指定したFormatに完全一致する文字列だけを変換します。
C#using System.Globalization;
string text = "2026/06/06";
DateTime date = DateTime.ParseExact(
text,
"yyyy/MM/dd",
CultureInfo.InvariantCulture
);
Console.WriteLine(date);
ParseExactは、指定したFormatと入力文字列が一致しない場合、FormatExceptionを投げます。
C#using System.Globalization;
string text = "2026-06-06";
// Formatが yyyy/MM/dd なので、ハイフン区切りは失敗する
DateTime date = DateTime.ParseExact(
text,
"yyyy/MM/dd",
CultureInfo.InvariantCulture
);
ParseExactやTryParseExactでは、入力文字列が指定したパターンに正確に一致する必要があります。Microsoft Learnでも、これらのメソッドでは解析が成功するために入力文字列が特定のパターンに完全一致している必要があると説明されています。
5-4. DateTime.TryParseExactで安全に厳密変換する
実務で特におすすめなのがDateTime.TryParseExactです。
C#using System.Globalization;
string text = "2026/06/06";
bool success = DateTime.TryParseExact(
text,
"yyyy/MM/dd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date
);
if (success)
{
Console.WriteLine($"変換成功: {date}");
}
else
{
Console.WriteLine("変換失敗");
}
TryParseExactは、指定したFormatに一致した場合のみ変換し、失敗しても例外を投げません。Microsoft Learnでも、TryParseExactは指定したFormat、カルチャ固有のFormat情報、スタイルを使って文字列をDateTimeに変換し、成功したかどうかを返すメソッドとして説明されています。
ユーザー入力や外部データのように不正な値が混ざる可能性がある場合は、ParseExactよりTryParseExactのほうが扱いやすいです。
5-5. 複数のFormatを許可して変換する
入力形式が複数ある場合は、Formatの配列を渡せます。
C#using System.Globalization;
string text = "2026-06-06";
string[] formats =
{
"yyyy/MM/dd",
"yyyy-MM-dd",
"yyyyMMdd"
};
bool success = DateTime.TryParseExact(
text,
formats,
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date
);
if (success)
{
Console.WriteLine(date.ToString("yyyy/MM/dd"));
}
else
{
Console.WriteLine("変換できませんでした");
}
CSVや外部システム連携では、日付がyyyy/MM/dd、yyyy-MM-dd、yyyyMMddのように複数パターンで届くことがあります。その場合でも、許可するFormatを明示しておくと安全です。
5-6. nullや空文字を変換するときの注意点
nullや空文字をDateTime.Parseすると、例外が発生します。
C#string text = "";
DateTime date = DateTime.Parse(text); // 例外
ユーザー入力やCSVでは、日付が空のことがあります。その場合は、事前にチェックしましょう。
C#string text = "";
if (string.IsNullOrWhiteSpace(text))
{
Console.WriteLine("日付が入力されていません");
}
else if (DateTime.TryParse(text, out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("日付形式が正しくありません");
}
日付が任意入力の場合は、DateTime?を使うと扱いやすいです。
C#DateTime? parsedDate = null;
string text = "";
if (!string.IsNullOrWhiteSpace(text) &&
DateTime.TryParse(text, out DateTime date))
{
parsedDate = date;
}
Console.WriteLine(parsedDate.HasValue ? parsedDate.Value.ToString("yyyy/MM/dd") : "未入力");
5-7. ユーザー入力・CSV・APIレスポンスを変換する実用例
ユーザー入力を変換する例です。
C#using System.Globalization;
string input = "2026/06/06";
if (DateTime.TryParseExact(
input,
"yyyy/MM/dd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
Console.WriteLine($"入力日: {date:yyyy年M月d日}");
}
else
{
Console.WriteLine("日付は yyyy/MM/dd 形式で入力してください");
}
CSVの日付を変換する例です。
C#using System.Globalization;
string csvDate = "20260606";
if (DateTime.TryParseExact(
csvDate,
"yyyyMMdd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
Console.WriteLine(date.ToString("yyyy/MM/dd"));
}
APIレスポンスのISO 8601文字列を変換する例です。
C#using System.Globalization;
string apiDate = "2026-06-06T14:05:09.0000000Z";
DateTime date = DateTime.Parse(
apiDate,
CultureInfo.InvariantCulture,
DateTimeStyles.RoundtripKind
);
Console.WriteLine(date.ToString("o"));
タイムゾーンオフセットを含むAPIレスポンスでは、DateTimeOffsetを使うと安全です。
C#string apiDate = "2026-06-06T14:05:09+09:00";
DateTimeOffset dto = DateTimeOffset.Parse(
apiDate,
CultureInfo.InvariantCulture
);
Console.WriteLine(dto.ToString("o"));
6. CultureInfoを使った日時Formatの制御
DateTime Formatでは、CultureInfoが重要です。
CultureInfoを指定すると、日付の区切り、曜日名、月名、AM/PM表記などを制御できます。
C#using System.Globalization;
DateTime date = new DateTime(2026, 6, 6, 14, 5, 9);
Console.WriteLine(date.ToString("D", new CultureInfo("ja-JP")));
Console.WriteLine(date.ToString("D", new CultureInfo("en-US")));
出力例です。
2026年6月6日
Saturday, June 6, 2026
6-1. CultureInfoとは
CultureInfoは、言語や地域に関する情報を表すクラスです。
日時Formatでは、次のような情報に影響します。
C#using System.Globalization;
DateTime date = new DateTime(2026, 6, 6, 14, 5, 9);
CultureInfo ja = new CultureInfo("ja-JP");
CultureInfo en = new CultureInfo("en-US");
Console.WriteLine(date.ToString("D", ja));
Console.WriteLine(date.ToString("D", en));
出力例です。
2026年6月6日
Saturday, June 6, 2026
DateTime.ToString(String)は現在のカルチャの書式設定規則を使うため、実行環境によって結果が変わる可能性があります。
そのため、表示仕様が決まっている場合は、CultureInfoを明示することが大切です。
6-2. 日本語環境でのDateTime Format
日本語環境では、ja-JPを指定します。
C#using System.Globalization;
DateTime date = new DateTime(2026, 6, 6, 14, 5, 9);
CultureInfo culture = new CultureInfo("ja-JP");
Console.WriteLine(date.ToString("yyyy年M月d日", culture));
// 2026年6月6日
Console.WriteLine(date.ToString("dddd", culture));
// 土曜日
Console.WriteLine(date.ToString("tt hh:mm", culture));
// 午後 02:05
日本語の曜日や午前/午後を明示したい場合に便利です。
C#Console.WriteLine(date.ToString("yyyy年M月d日(ddd) HH:mm", culture));
// 2026年6月6日(土) 14:05
6-3. en-USとja-JPで表示形式が変わる理由
同じDateTimeでも、カルチャが違うと出力が変わります。
C#using System.Globalization;
DateTime date = new DateTime(2026, 6, 6, 14, 5, 9);
Console.WriteLine(date.ToString("D", new CultureInfo("ja-JP")));
Console.WriteLine(date.ToString("D", new CultureInfo("en-US")));
出力例です。
2026年6月6日
Saturday, June 6, 2026
これは、カルチャごとに日付の表現、曜日名、月名、AM/PM表記などが異なるためです。
固定のFormatを使う場合でも、曜日や月名を含むとカルチャの影響を受けます。
C#Console.WriteLine(date.ToString("yyyy/MM/dd dddd", new CultureInfo("ja-JP")));
// 2026/06/06 土曜日
Console.WriteLine(date.ToString("yyyy/MM/dd dddd", new CultureInfo("en-US")));
// 2026/06/06 Saturday
6-4. CultureInfo.InvariantCultureを使うべきケース
CultureInfo.InvariantCultureは、カルチャに依存しない固定的なFormatを扱いたいときに使います。
C#using System.Globalization;
DateTime date = new DateTime(2026, 6, 6, 14, 5, 9);
string text = date.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);
Console.WriteLine(text);
CSV、ログ、API、データ連携、設定ファイルなどでは、ユーザーの言語設定によってFormatが変わると困ります。そのような場面ではInvariantCultureを使うのが安全です。
C#DateTime parsed = DateTime.ParseExact(
"2026-06-06",
"yyyy-MM-dd",
CultureInfo.InvariantCulture
);
ユーザーに見せる表示ではCurrentCultureやja-JP、システム間連携ではInvariantCultureと考えると整理しやすいです。
6-5. 多言語対応アプリでの日時表示の考え方
多言語対応アプリでは、日時の扱いを次のように分けるのがおすすめです。
内部処理では、DateTimeやDateTimeOffsetのまま扱います。
C#DateTimeOffset createdAt = DateTimeOffset.UtcNow;
保存やAPI連携では、ISO 8601などのカルチャ非依存形式を使います。
C#string value = createdAt.ToString("o", CultureInfo.InvariantCulture);
画面表示では、ユーザーのカルチャに合わせます。
C#CultureInfo userCulture = new CultureInfo("ja-JP");
Console.WriteLine(createdAt.ToString("D", userCulture));
このように、保存用、連携用、表示用を分けると、日時Formatのトラブルを減らせます。
6-6. 和暦表示を扱うときの注意点
日本向けシステムでは、和暦表示が必要になることがあります。
C#using System.Globalization;
DateTime date = new DateTime(2026, 6, 6);
CultureInfo culture = new CultureInfo("ja-JP");
culture.DateTimeFormat.Calendar = new JapaneseCalendar();
Console.WriteLine(date.ToString("gg y年M月d日", culture));
出力例です。
令和 8年6月6日
和暦を扱う場合は、元号の変更があるため注意が必要です。保存データとしては西暦やISO 8601形式で保持し、表示時だけ和暦に変換する設計が安全です。
C#// 保存用
string saveValue = date.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
// 表示用
string displayValue = date.ToString("gg y年M月d日", culture);
7. タイムゾーン・UTC・DateTimeOffsetとFormat
日時Formatを扱うとき、タイムゾーンの考慮は非常に重要です。
同じ2026-06-06 14:00:00でも、それが日本時間なのかUTCなのか、別の地域の時刻なのかによって意味が変わります。
C#では、DateTimeにKindという情報があります。また、タイムゾーンオフセットを明確に持つにはDateTimeOffsetが便利です。
7-1. DateTimeKindとは
DateTimeKindは、DateTimeがどの種類の時刻かを表す情報です。
主に次の3つがあります。
| Kind | 意味 |
|---|---|
Local | ローカル時刻 |
Utc | UTC |
Unspecified | 指定なし |
確認する例です。
C#DateTime local = DateTime.Now;
DateTime utc = DateTime.UtcNow;
DateTime unspecified = new DateTime(2026, 6, 6, 14, 0, 0);
Console.WriteLine(local.Kind); // Local
Console.WriteLine(utc.Kind); // Utc
Console.WriteLine(unspecified.Kind); // Unspecified
Formatするときは、見た目だけでなく、その日時がどのタイムゾーンの値なのかを意識しましょう。
7-2. Local/Utc/Unspecifiedの違い
Localは実行環境のローカル時刻です。
C#DateTime local = DateTime.Now;
Console.WriteLine(local.Kind); // Local
Utcは協定世界時です。
C#DateTime utc = DateTime.UtcNow;
Console.WriteLine(utc.Kind); // Utc
Unspecifiedは、ローカルかUTCかが指定されていない状態です。
C#DateTime date = new DateTime(2026, 6, 6, 14, 0, 0);
Console.WriteLine(date.Kind); // Unspecified
Unspecifiedの値をAPIやDBで扱うと、受け手がローカル時刻として解釈したり、UTCとして解釈したりする可能性があります。システム間連携では、UtcやDateTimeOffsetを使って意味を明確にしましょう。
7-3. UTC日時をFormatして表示する
UTC日時を出力する場合は、DateTime.UtcNowを使います。
C#DateTime utcNow = DateTime.UtcNow;
Console.WriteLine(utcNow.ToString("yyyy-MM-dd HH:mm:ss"));
ただし、このFormatだけではUTCであることが見た目からわかりません。
2026-06-06 05:05:09
UTCであることを明示するには、"o"を使うと便利です。
C#Console.WriteLine(utcNow.ToString("o"));
出力例です。
2026-06-06T05:05:09.0000000Z
ZはUTCを表します。
7-4. DateTimeOffsetを使うべきケース
DateTimeOffsetは、日時とUTCからのオフセットを一緒に表す型です。
C#DateTimeOffset now = DateTimeOffset.Now;
Console.WriteLine(now.ToString("o"));
出力例です。
2026-06-06T14:05:09.0000000+09:00
+09:00のようなオフセットが含まれるため、その日時がUTCから何時間ずれているかが明確です。
次のような場面では、DateTimeOffsetが向いています。
APIで日時を送受信する場合、複数タイムゾーンのユーザーを扱う場合、ログの発生時刻を正確に残したい場合、外部システムと日時を連携する場合です。
カスタム日時書式文字列は、DateTimeだけでなくDateTimeOffsetにも使用できます。
7-5. タイムゾーンオフセットを含めて表示する
DateTimeOffsetでオフセットを含めて表示するには、zzzを使います。
C#DateTimeOffset dto = new DateTimeOffset(
2026, 6, 6, 14, 5, 9,
TimeSpan.FromHours(9)
);
Console.WriteLine(dto.ToString("yyyy-MM-dd HH:mm:ss zzz"));
出力例です。
2026-06-06 14:05:09 +09:00
ISO 8601形式で出すなら、"o"が便利です。
C#Console.WriteLine(dto.ToString("o"));
出力例です。
2026-06-06T14:05:09.0000000+09:00
タイムゾーンやオフセットを含める必要がある場合、単純なDateTimeよりDateTimeOffsetを使うと意味が明確になります。
7-6. APIやJSONで安全に日時を扱うFormat
APIやJSONで日時を扱う場合は、次のようなFormatがおすすめです。
C#DateTimeOffset now = DateTimeOffset.Now;
string value = now.ToString("o", CultureInfo.InvariantCulture);
Console.WriteLine(value);
出力例です。
2026-06-06T14:05:09.0000000+09:00
UTCに統一する場合は、次のようにします。
C#DateTimeOffset utc = DateTimeOffset.UtcNow;
Console.WriteLine(utc.ToString("o", CultureInfo.InvariantCulture));
出力例です。
2026-06-06T05:05:09.0000000+00:00
JSONやAPIでは、ユーザー表示用のyyyy年M月d日のようなFormatではなく、機械的に解釈しやすいISO 8601形式を使うのが基本です。
7-7. ログ出力で推奨される日時Format
ログでは、時系列で追いやすく、並べ替えやすく、タイムゾーンが明確なFormatが便利です。
ローカル時刻でログを出す例です。
C#DateTime now = DateTime.Now;
Console.WriteLine($"{now:yyyy-MM-dd HH:mm:ss.fff} INFO 処理を開始しました");
出力例です。
2026-06-06 14:05:09.123 INFO 処理を開始しました
UTCでログを出す例です。
C#DateTime utcNow = DateTime.UtcNow;
Console.WriteLine($"{utcNow:o} INFO 処理を開始しました");
出力例です。
2026-06-06T05:05:09.1230000Z INFO 処理を開始しました
オフセット付きでログを出す例です。
C#DateTimeOffset now = DateTimeOffset.Now;
Console.WriteLine($"{now:yyyy-MM-dd HH:mm:ss.fff zzz} INFO 処理を開始しました");
出力例です。
2026-06-06 14:05:09.123 +09:00 INFO 処理を開始しました
分散システムやクラウド環境では、UTCまたはオフセット付きの日時を使うとトラブルを減らせます。
8. C# DateTime Formatでよくあるエラーと原因
DateTime Formatでは、書式指定子の間違いやカルチャの違いによってエラーや意図しない表示が発生します。
特に多いのは、FormatException、MMとmmの間違い、HHとhhの間違い、ParseExactの不一致です。
8-1. FormatExceptionが発生する原因
FormatExceptionは、文字列を日時として変換できないときによく発生します。
C#string text = "abc";
DateTime date = DateTime.Parse(text); // FormatException
ParseExactでも、Formatと入力文字列が一致しない場合に発生します。
C#using System.Globalization;
string text = "2026-06-06";
DateTime date = DateTime.ParseExact(
text,
"yyyy/MM/dd",
CultureInfo.InvariantCulture
); // FormatException
この例では、入力はハイフン区切りですが、Formatはスラッシュ区切りです。
修正するには、Formatを入力に合わせます。
C#DateTime date = DateTime.ParseExact(
text,
"yyyy-MM-dd",
CultureInfo.InvariantCulture
);
例外を避けたい場合は、TryParseExactを使いましょう。
C#if (DateTime.TryParseExact(
text,
"yyyy-MM-dd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("変換できませんでした");
}
8-2. yyyyとYYYYを間違えたときの問題
C#のDateTimeで年を表すには、yyyyを使います。
C#DateTime date = new DateTime(2026, 6, 6);
Console.WriteLine(date.ToString("yyyy-MM-dd")); // 2026-06-06
他の言語やライブラリの書式に慣れていると、YYYYと書いてしまうことがあります。
C#Console.WriteLine(date.ToString("YYYY-MM-dd"));
C#のDateTimeのカスタム書式では、通常の4桁年としてYYYYを使いません。期待した年が表示されない原因になります。
年は必ず小文字のyyyyを使いましょう。
C#// 正しい
string text = date.ToString("yyyy-MM-dd");
8-3. MMとmmを間違えたときの問題
MMは月、mmは分です。
C#DateTime date = new DateTime(2026, 6, 6, 14, 5, 9);
Console.WriteLine(date.ToString("yyyy/MM/dd")); // 2026/06/06
Console.WriteLine(date.ToString("yyyy/mm/dd")); // 2026/05/06
yyyy/mm/ddと書くと、月の位置に分が表示されます。
この例では分が05なので、月が5月のように見えてしまいます。
日付Formatでは大文字のMMを使いましょう。
C#string result = date.ToString("yyyy/MM/dd");
8-4. HHとhhを間違えたときの問題
HHは24時間表記、hhは12時間表記です。
C#DateTime date = new DateTime(2026, 6, 6, 14, 5, 9);
Console.WriteLine(date.ToString("HH:mm")); // 14:05
Console.WriteLine(date.ToString("hh:mm")); // 02:05
午後2時を14:05と表示したいなら、HHを使います。
C#string result = date.ToString("HH:mm:ss");
hhを使う場合は、ttも付けましょう。
C#Console.WriteLine(date.ToString("tt hh:mm", new CultureInfo("ja-JP")));
// 午後 02:05
8-5. ParseExactで変換できない原因
ParseExactで変換できない主な原因は、入力文字列とFormatが完全一致していないことです。
C#using System.Globalization;
string text = "2026/6/6";
DateTime date = DateTime.ParseExact(
text,
"yyyy/MM/dd",
CultureInfo.InvariantCulture
);
この例では、FormatはMMとddなので、月と日が2桁である必要があります。
入力が2026/6/6なら、Formatはyyyy/M/dにします。
C#DateTime date = DateTime.ParseExact(
text,
"yyyy/M/d",
CultureInfo.InvariantCulture
);
また、空白の有無も一致している必要があります。
C#string text = "2026/06/06 14:05:09";
DateTime date = DateTime.ParseExact(
text,
"yyyy/MM/dd HH:mm:ss",
CultureInfo.InvariantCulture
);
ParseExactは厳密な分、入力仕様が決まっている場合には非常に有効です。
8-6. カルチャの違いで変換結果が変わる問題
ParseやToStringは、カルチャの影響を受けることがあります。
C#using System.Globalization;
string text = "06/07/2026";
DateTime usDate = DateTime.Parse(text, new CultureInfo("en-US"));
DateTime jaDate = DateTime.Parse(text, new CultureInfo("ja-JP"));
Console.WriteLine(usDate);
Console.WriteLine(jaDate);
日付の順序や区切りの解釈がカルチャによって異なるため、曖昧なFormatは避けましょう。
システム間連携では、次のようにFormatとCultureInfoを明示します。
C#DateTime date = DateTime.ParseExact(
"2026-06-07",
"yyyy-MM-dd",
CultureInfo.InvariantCulture
);
表示用と変換用でカルチャを適切に使い分けることが重要です。
8-7. 日付として存在しない値を変換したときのエラー
存在しない日付は変換できません。
C#string text = "2026/02/30";
DateTime date = DateTime.ParseExact(
text,
"yyyy/MM/dd",
CultureInfo.InvariantCulture
);
2月30日は存在しないため、例外になります。
安全に処理するには、TryParseExactを使います。
C#string text = "2026/02/30";
if (DateTime.TryParseExact(
text,
"yyyy/MM/dd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("存在しない日付です");
}
ユーザー入力では、Formatだけでなく、実在する日付かどうかもチェックしましょう。
8-8. 期待した表示形式にならないときの確認ポイント
期待した表示形式にならない場合は、次の点を確認しましょう。
MMとmmを間違えていないか確認します。
C#// 月
"yyyy/MM/dd"
// 分
"HH:mm:ss"
HHとhhを間違えていないか確認します。
C#// 24時間表記
"HH:mm:ss"
// 12時間表記
"hh:mm:ss"
年にYYYYを使っていないか確認します。
C#// 正しい
"yyyy-MM-dd"
カルチャが影響していないか確認します。
C#date.ToString("D", new CultureInfo("ja-JP"));
ParseExactでは、入力文字列とFormatが完全一致しているか確認します。
C#"2026/06/06" // 入力
"yyyy/MM/dd" // Format
日時の表示トラブルは、ほとんどの場合、Format文字列、カルチャ、入力文字列の不一致を確認すると解決できます。
9. 実務でよく使うDateTime Formatサンプル集
ここでは、実務でそのまま使いやすいDateTime Formatのサンプルを紹介します。
9-1. 画面表示用の日付Format
画面表示では、ユーザーにとって読みやすいFormatを使います。
C#DateTime date = new DateTime(2026, 6, 6);
Console.WriteLine(date.ToString("yyyy/MM/dd"));
// 2026/06/06
Console.WriteLine(date.ToString("yyyy年M月d日"));
// 2026年6月6日
曜日付きにする場合です。
C#using System.Globalization;
DateTime date = new DateTime(2026, 6, 6);
CultureInfo culture = new CultureInfo("ja-JP");
Console.WriteLine(date.ToString("yyyy年M月d日(ddd)", culture));
// 2026年6月6日(土)
画面ではゼロ埋めなしのほうが自然に見えることもあります。
C#Console.WriteLine(date.ToString("yyyy年M月d日"));
9-2. 帳票・請求書向けの日付Format
帳票や請求書では、日本語の日付形式がよく使われます。
C#DateTime invoiceDate = new DateTime(2026, 6, 6);
string text = invoiceDate.ToString("yyyy年M月d日");
Console.WriteLine(text); // 2026年6月6日
請求月を表示する場合です。
C#DateTime targetMonth = new DateTime(2026, 6, 1);
Console.WriteLine(targetMonth.ToString("yyyy年M月分"));
// 2026年6月分
和暦が必要な場合です。
C#using System.Globalization;
DateTime date = new DateTime(2026, 6, 6);
CultureInfo culture = new CultureInfo("ja-JP");
culture.DateTimeFormat.Calendar = new JapaneseCalendar();
Console.WriteLine(date.ToString("gg y年M月d日", culture));
9-3. ファイル名に使える日時Format
ファイル名には、/や:を含めないFormatを使います。
C#DateTime now = DateTime.Now;
string fileName = $"export_{now:yyyyMMddHHmmss}.csv";
Console.WriteLine(fileName);
出力例です。
export_20260606140509.csv
ミリ秒まで含める場合です。
C#string fileName = $"log_{DateTime.Now:yyyyMMddHHmmssfff}.txt";
日付だけでよい場合です。
C#string fileName = $"report_{DateTime.Today:yyyyMMdd}.xlsx";
9-4. ログ出力に使える日時Format
ログでは、時系列で見やすいFormatを使います。
C#DateTime now = DateTime.Now;
Console.WriteLine($"{now:yyyy-MM-dd HH:mm:ss.fff} INFO 処理開始");
出力例です。
2026-06-06 14:05:09.123 INFO 処理開始
UTCで出す場合です。
C#Console.WriteLine($"{DateTime.UtcNow:o} INFO 処理開始");
DateTimeOffsetでオフセットを含める場合です。
C#DateTimeOffset now = DateTimeOffset.Now;
Console.WriteLine($"{now:yyyy-MM-dd HH:mm:ss.fff zzz} INFO 処理開始");
9-5. データベース保存時に注意したいFormat
データベースに保存する場合、基本的には日時を文字列ではなく、日時型のカラムに保存します。
悪い例です。
C#// 文字列として保存する設計は避けたい
string createdAt = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
よい例です。
C#DateTime createdAt = DateTime.Now;
SQL Serverならdatetime2、PostgreSQLならtimestampやtimestamptzなど、DB側の日時型を使うのが一般的です。
表示形式はDB保存時ではなく、取り出して画面に表示するときに指定します。
C#Console.WriteLine(createdAt.ToString("yyyy/MM/dd HH:mm:ss"));
文字列で保存せざるを得ない場合は、yyyy-MM-ddTHH:mm:ssやoなど、並べ替えや解析がしやすいFormatを使いましょう。
9-6. JSON・API連携で使うFormat
JSONやAPI連携では、ISO 8601形式がよく使われます。
C#DateTimeOffset now = DateTimeOffset.Now;
string value = now.ToString("o", CultureInfo.InvariantCulture);
Console.WriteLine(value);
出力例です。
2026-06-06T14:05:09.0000000+09:00
UTCで送る場合です。
C#DateTime utc = DateTime.UtcNow;
string value = utc.ToString("o", CultureInfo.InvariantCulture);
APIレスポンスを受け取る場合です。
C#string value = "2026-06-06T14:05:09.0000000+09:00";
DateTimeOffset dto = DateTimeOffset.Parse(
value,
CultureInfo.InvariantCulture
);
Console.WriteLine(dto.ToString("o"));
ユーザー向けの日本語FormatをAPIに使うのは避けたほうが安全です。
9-7. ASP.NET Coreで日時を表示する例
ASP.NET Core MVCやRazor Pagesでは、ビューでFormatできます。
C#@Model.CreatedAt.ToString("yyyy/MM/dd HH:mm:ss")
文字列補間を使う場合です。
C#@($"{Model.CreatedAt:yyyy/MM/dd HH:mm:ss}")
ただし、ビューにFormatが散らばると保守しづらくなります。共通の表示Formatを定数化するか、ViewModel側で表示用文字列を用意する方法もあります。
C#public class UserViewModel
{
public DateTime CreatedAt { get; set; }
public string CreatedAtText => CreatedAt.ToString("yyyy/MM/dd HH:mm:ss");
}
ビュー側です。
C#@Model.CreatedAtText
多言語対応が必要な場合は、ユーザーのカルチャを考慮してFormatしましょう。
9-8. LINQや文字列補間でFormatする例
LINQで日時をFormatする例です。
C#var orders = new[]
{
new { Id = 1, CreatedAt = new DateTime(2026, 6, 1, 10, 0, 0) },
new { Id = 2, CreatedAt = new DateTime(2026, 6, 2, 11, 30, 0) }
};
var result = orders.Select(x => new
{
x.Id,
CreatedAtText = x.CreatedAt.ToString("yyyy/MM/dd HH:mm:ss")
});
foreach (var item in result)
{
Console.WriteLine($"{item.Id}: {item.CreatedAtText}");
}
文字列補間でFormatする例です。
C#DateTime now = DateTime.Now;
string message = $"現在日時は {now:yyyy年M月d日 HH時mm分ss秒} です。";
Console.WriteLine(message);
出力例です。
現在日時は 2026年6月6日 14時05分09秒 です。
文字列補間を使うと、ToStringを明示しなくても読みやすく書けます。
10. DateOnly・TimeOnlyのFormat
.NET 6以降では、日付だけを表すDateOnlyと、時刻だけを表すTimeOnlyが使えます。
DateTimeは日付と時刻の両方を持ちますが、業務では「日付だけ」「時刻だけ」を扱いたい場面があります。
たとえば、生年月日、請求日、予約日などはDateOnlyが向いています。営業時間、開始時刻、終了時刻などはTimeOnlyが向いています。
DateOnlyとTimeOnlyは.NET 6で導入された型で、それぞれ日付のみ、時刻のみを表します。また、.NET Frameworkでは使用できません。
10-1. DateOnlyとは
DateOnlyは、日付だけを表す型です。
C#DateOnly date = new DateOnly(2026, 6, 6);
Console.WriteLine(date);
DateTimeと違い、時刻を持ちません。
C#DateOnly birthday = new DateOnly(1990, 1, 5);
生年月日、祝日、営業日、締切日など、時刻が不要なデータに向いています。
10-2. TimeOnlyとは
TimeOnlyは、時刻だけを表す型です。
C#TimeOnly time = new TimeOnly(14, 5, 9);
Console.WriteLine(time);
日付を持たないため、営業時間や毎日の開始時刻などに向いています。
C#TimeOnly openingTime = new TimeOnly(9, 0);
TimeOnly closingTime = new TimeOnly(18, 0);
「2026年6月6日の9時」ではなく、「毎日9時」のような意味を表したい場合に便利です。
10-3. DateOnlyをFormatして表示する
DateOnlyもToStringでFormatできます。
C#DateOnly date = new DateOnly(2026, 6, 6);
Console.WriteLine(date.ToString("yyyy/MM/dd"));
// 2026/06/06
Console.WriteLine(date.ToString("yyyy年M月d日"));
// 2026年6月6日
CultureInfoを指定することもできます。
C#using System.Globalization;
DateOnly date = new DateOnly(2026, 6, 6);
CultureInfo culture = new CultureInfo("ja-JP");
Console.WriteLine(date.ToString("yyyy年M月d日 dddd", culture));
日付だけが必要な画面では、DateTimeより意味が明確になります。
10-4. TimeOnlyをFormatして表示する
TimeOnlyもFormatできます。
C#TimeOnly time = new TimeOnly(14, 5, 9);
Console.WriteLine(time.ToString("HH:mm"));
// 14:05
Console.WriteLine(time.ToString("HH:mm:ss"));
// 14:05:09
12時間表記にする場合です。
C#using System.Globalization;
TimeOnly time = new TimeOnly(14, 5, 9);
Console.WriteLine(time.ToString("tt hh:mm", new CultureInfo("ja-JP")));
// 午後 02:05
営業時間の表示例です。
C#TimeOnly start = new TimeOnly(9, 0);
TimeOnly end = new TimeOnly(18, 0);
Console.WriteLine($"{start:HH:mm}〜{end:HH:mm}");
// 09:00〜18:00
10-5. DateTimeとDateOnly・TimeOnlyの使い分け
DateTime、DateOnly、TimeOnlyは、目的に応じて使い分けます。
日時の両方が必要な場合は、DateTimeを使います。
C#DateTime createdAt = DateTime.Now;
日付だけが必要な場合は、DateOnlyを使います。
C#DateOnly birthday = new DateOnly(1990, 1, 5);
時刻だけが必要な場合は、TimeOnlyを使います。
C#TimeOnly startTime = new TimeOnly(9, 0);
たとえば、登録日時や更新日時はDateTimeやDateTimeOffsetが向いています。生年月日や請求日はDateOnlyが向いています。営業時間や予約枠の開始時刻はTimeOnlyが向いています。
ただし、使用できる.NETのバージョンには注意しましょう。DateOnlyとTimeOnlyは.NET 6以降の型です。
11. C# DateTime Formatのベストプラクティス
DateTime Formatを安全に扱うためには、表示用、保存用、連携用を分けることが重要です。
また、カルチャ、タイムゾーン、例外処理、Format文字列の管理も意識しましょう。
11-1. 表示用Formatと保存用Formatを分ける
表示用Formatと保存用Formatは分けて考えます。
表示用は、ユーザーにとって読みやすい形式にします。
C#string display = date.ToString("yyyy年M月d日");
保存用は、日時型のまま保存するのが基本です。
C#DateTime createdAt = DateTime.Now;
文字列として保存や連携をする必要がある場合は、ISO 8601形式など、機械的に扱いやすいFormatにします。
C#string value = DateTimeOffset.Now.ToString("o", CultureInfo.InvariantCulture);
画面表示の都合で、保存形式をyyyy年M月d日のような文字列にするのは避けましょう。
11-2. ユーザー向け表示ではCultureInfoを考慮する
ユーザー向け表示では、カルチャを考慮します。
C#using System.Globalization;
DateTime date = new DateTime(2026, 6, 6);
Console.WriteLine(date.ToString("D", new CultureInfo("ja-JP")));
Console.WriteLine(date.ToString("D", new CultureInfo("en-US")));
日本向けだけのアプリならja-JPを明示してもよいでしょう。
C#CultureInfo culture = new CultureInfo("ja-JP");
string text = date.ToString("yyyy年M月d日(ddd)", culture);
多言語対応アプリなら、ユーザーの設定やリクエストのカルチャに合わせて表示します。
11-3. システム間連携ではISO 8601を優先する
API、JSON、メッセージキュー、外部システム連携では、ISO 8601形式を優先します。
C#DateTimeOffset now = DateTimeOffset.Now;
string value = now.ToString("o", CultureInfo.InvariantCulture);
出力例です。
2026-06-06T14:05:09.0000000+09:00
日本語の表示形式は、人間には読みやすいですが、システム間連携には不向きです。
C#// API連携には不向き
"2026年6月6日"
// API連携に向いている
"2026-06-06T14:05:09.0000000+09:00"
11-4. 文字列変換よりDateTime型のまま扱うべき場面
日付の比較、加算、減算、検索条件、期間計算では、文字列ではなくDateTime型のまま扱いましょう。
C#DateTime start = new DateTime(2026, 6, 1);
DateTime end = new DateTime(2026, 6, 30);
DateTime target = new DateTime(2026, 6, 6);
if (start <= target && target <= end)
{
Console.WriteLine("期間内です");
}
文字列にしてから比較すると、Formatによっては正しく比較できないことがあります。
C#string a = "2026/6/10";
string b = "2026/6/2";
Console.WriteLine(string.Compare(a, b)); // 日付順とは限らない
日時は日時型で処理し、最後に表示用としてFormatするのが基本です。
11-5. 例外を避けるためにTryParseExactを使う
外部から受け取る文字列は、必ずしも正しいとは限りません。
C#string input = "2026/02/30";
このような値をParseExactで処理すると、例外が発生します。
実務では、TryParseExactを使うと安全です。
C#if (DateTime.TryParseExact(
input,
"yyyy/MM/dd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("日付形式が正しくありません");
}
入力Formatが複数ある場合は、Format配列を使います。
C#string[] formats = { "yyyy/MM/dd", "yyyy-MM-dd", "yyyyMMdd" };
DateTime.TryParseExact(
input,
formats,
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date
);
11-6. Format文字列を定数化して保守しやすくする
Format文字列をコード内に何度も直接書くと、修正漏れが起こりやすくなります。
C#Console.WriteLine(date.ToString("yyyy/MM/dd"));
Console.WriteLine(updatedAt.ToString("yyyy/MM/dd"));
Console.WriteLine(deletedAt.ToString("yyyy/MM/dd"));
共通で使うFormatは定数化すると保守しやすくなります。
C#public static class DateTimeFormats
{
public const string Date = "yyyy/MM/dd";
public const string DateTime = "yyyy/MM/dd HH:mm:ss";
public const string FileTimestamp = "yyyyMMddHHmmss";
public const string LogTimestamp = "yyyy-MM-dd HH:mm:ss.fff";
}
使う側です。
C#Console.WriteLine(date.ToString(DateTimeFormats.Date));
Console.WriteLine(now.ToString(DateTimeFormats.LogTimestamp));
Formatを定数化しておくと、仕様変更にも対応しやすくなります。
12. C# DateTime Formatに関するよくある質問
12-1. DateTimeをyyyyMMdd形式にするには?
ToString("yyyyMMdd")を使います。
C#DateTime date = new DateTime(2026, 6, 6);
string result = date.ToString("yyyyMMdd");
Console.WriteLine(result); // 20260606
ファイル名、ID、CSVなどでよく使われる形式です。
12-2. DateTimeをyyyy-MM-dd HH:mm:ss形式にするには?
次のように書きます。
C#DateTime date = new DateTime(2026, 6, 6, 14, 5, 9);
string result = date.ToString("yyyy-MM-dd HH:mm:ss");
Console.WriteLine(result); // 2026-06-06 14:05:09
ログや管理画面で使いやすいFormatです。
12-3. 文字列のyyyyMMddをDateTimeに変換するには?
ParseExactまたはTryParseExactを使います。
C#using System.Globalization;
string text = "20260606";
DateTime date = DateTime.ParseExact(
text,
"yyyyMMdd",
CultureInfo.InvariantCulture
);
Console.WriteLine(date.ToString("yyyy/MM/dd")); // 2026/06/06
安全に変換するならTryParseExactです。
C#if (DateTime.TryParseExact(
text,
"yyyyMMdd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("変換できません");
}
12-4. 24時間表記にするにはHHとhhのどちらを使う?
24時間表記にするには、HHを使います。
C#DateTime date = new DateTime(2026, 6, 6, 14, 5, 9);
Console.WriteLine(date.ToString("HH:mm")); // 14:05
hhは12時間表記です。
C#Console.WriteLine(date.ToString("hh:mm")); // 02:05
午後か午前かを表示したい場合は、ttを付けます。
C#Console.WriteLine(date.ToString("tt hh:mm", new CultureInfo("ja-JP")));
// 午後 02:05
12-5. 月が分として表示されるのはなぜ?
月に使うべきMMを、分を表すmmで書いている可能性があります。
C#DateTime date = new DateTime(2026, 6, 6, 14, 5, 9);
Console.WriteLine(date.ToString("yyyy/mm/dd")); // 2026/05/06
この例では、mmが分の05として表示されています。
正しくは次のように書きます。
C#Console.WriteLine(date.ToString("yyyy/MM/dd")); // 2026/06/06
月は大文字のMM、分は小文字のmmです。
12-6. DateTimeのFormatをグローバルに変更できる?
現在のカルチャを変更すれば、標準書式指定子やFormat省略時の表示に影響を与えることはできます。
C#using System.Globalization;
CultureInfo.CurrentCulture = new CultureInfo("ja-JP");
DateTime date = DateTime.Now;
Console.WriteLine(date.ToString("D"));
ただし、アプリ全体の表示に影響するため注意が必要です。
固定の表示形式が必要な場合は、グローバル設定に頼らず、各所でFormatを明示するほうが安全です。
C#Console.WriteLine(date.ToString("yyyy/MM/dd HH:mm:ss"));
多言語対応アプリでは、ユーザーごとのカルチャを使って表示する設計にしましょう。
12-7. DateTimeとDateTimeOffsetはどちらを使うべき?
単一のローカルアプリで日時を扱うだけなら、DateTimeでも十分な場面があります。
C#DateTime createdAt = DateTime.Now;
一方、API、JSON、ログ、複数タイムゾーン、外部システム連携では、DateTimeOffsetが向いています。
C#DateTimeOffset createdAt = DateTimeOffset.Now;
Console.WriteLine(createdAt.ToString("o"));
出力例です。
2026-06-06T14:05:09.0000000+09:00
オフセットが含まれるため、日時の意味が明確になります。
迷った場合、システム間連携や将来的なタイムゾーン対応があるならDateTimeOffsetを検討しましょう。
12-8. DateTimeのFormatで曜日を日本語表示するには?
dddまたはddddを使い、ja-JPのCultureInfoを指定します。
C#using System.Globalization;
DateTime date = new DateTime(2026, 6, 6);
CultureInfo culture = new CultureInfo("ja-JP");
Console.WriteLine(date.ToString("ddd", culture)); // 土
Console.WriteLine(date.ToString("dddd", culture)); // 土曜日
日付と組み合わせる場合です。
C#Console.WriteLine(date.ToString("yyyy年M月d日(ddd)", culture));
// 2026年6月6日(土)
長い曜日にする場合です。
C#Console.WriteLine(date.ToString("yyyy年M月d日 dddd", culture));
// 2026年6月6日 土曜日
まとめ
C#のDateTime Formatは、日時を扱ううえで必ず理解しておきたい基本機能です。
日時を文字列として表示するには、DateTime.ToString("yyyy/MM/dd")のようにFormatを指定します。日付だけならyyyy/MM/dd、日時ならyyyy/MM/dd HH:mm:ss、ファイル名ならyyyyMMddHHmmss、ログならyyyy-MM-dd HH:mm:ss.fff、APIやJSONならo形式がよく使われます。
特に重要なのは、DateTime型とstring型を混同しないことです。内部処理ではできるだけDateTimeやDateTimeOffsetのまま扱い、表示や出力の直前でFormatしましょう。
また、Format指定子は大文字と小文字で意味が変わります。月はMM、分はmm、24時間表記はHH、12時間表記はhhです。年はyyyyを使います。これらを間違えると、表示が意図しない結果になります。
文字列を日時に変換する場合は、ParseよりもTryParse、固定FormatならTryParseExactを使うと安全です。入力文字列とFormatが完全一致しているか、カルチャが適切か、存在しない日付ではないかを確認しましょう。
ユーザー向け表示ではCultureInfoを考慮し、システム間連携ではCultureInfo.InvariantCultureやISO 8601形式を使うと安定します。タイムゾーンやUTCを扱う場合は、DateTimeOffsetも検討しましょう。
DateTime Formatは単なる表示テクニックではなく、日時データを正確に扱うための設計にも関わります。表示用、保存用、連携用を分けて考えることで、実務でも安全で保守しやすい日時処理を書けます。

