C#で日付を文字列に変換・フォーマットする方法|DateTimeの使い方を完全解説
はじめに
C#で日付を扱うとき、画面表示やログ出力、CSV出力、API通信などでは、DateTime型の値を文字列へ変換する処理が必要になります。
たとえば、同じ日付でも用途によって次のように異なる形式が使われます。
2026/06/202026-06-20202606202026年06月20日2026-06-20T14:30:00.0000000+09:00C#では、主にDateTime.ToStringメソッドと日付フォーマット指定子を使用して、日付を任意の文字列に変換できます。また、CultureInfoを指定すれば、日本語や英語、和暦などの表示にも対応できます。
この記事では、C#で日付を文字列に変換する基本から、文字列をDateTime型へ戻す方法、タイムゾーンを含む日時の扱い、実務で使えるサンプルまで詳しく解説します。
1. C#で日付を文字列に変換する基本
1-1. DateTime型と文字列型の違い
DateTime型は、日付と時刻を値として保持するための型です。一方、string型は文字の並びを保持する型です。
DateTime date = new DateTime(2026, 6, 20);string text = "2026/06/20";どちらも同じ日付を表しているように見えますが、用途が異なります。
DateTime型では、日付の加算や比較ができます。
DateTime today = new DateTime(2026, 6, 20);DateTime tomorrow = today.AddDays(1);bool isFuture = tomorrow > today;
一方、文字列型は画面への表示やファイルへの出力に適していますが、そのままでは正確な日付計算に向きません。
string dateText = "2026/06/20";Console.WriteLine(dateText);基本的には、プログラム内部ではDateTimeやDateTimeOffsetとして保持し、表示や送信が必要になった時点で文字列へ変換します。
1-2. DateTime.ToStringメソッドの基本構文
C#で日付を文字列に変換する基本的な方法は、DateTime.ToStringメソッドを使用することです。
DateTime date = new DateTime(2026, 6, 20);string result = date.ToString();Console.WriteLine(result);
引数を指定しないToString()では、実行環境のカルチャ設定に基づいた形式で出力されます。そのため、コンピューターの言語や地域設定によって結果が変わる可能性があります。
任意の形式に変換する場合は、書式指定文字列を引数として渡します。
DateTime date = new DateTime(2026, 6, 20);string result = date.ToString("yyyy/MM/dd");Console.WriteLine(result);
実行結果は次のとおりです。
2026/06/20カルチャも明示する場合は、2番目の引数にCultureInfoを指定します。
using System.Globalization;DateTime date = new DateTime(2026, 6, 20);
string result = date.ToString("yyyy/MM/dd",CultureInfo.InvariantCulture);
1-3. 現在日時を文字列に変換する方法
現在のローカル日時は、DateTime.Nowで取得できます。
DateTime now = DateTime.Now;string result = now.ToString("yyyy/MM/dd HH:mm:ss");Console.WriteLine(result);
たとえば、2026年6月20日14時5分9秒に実行した場合は、次のような文字列になります。
2026/06/20 14:05:09現在の日付だけが必要な場合は、次のように変換できます。
string today = DateTime.Now.ToString("yyyy/MM/dd");UTCの現在日時を取得する場合は、DateTime.UtcNowを使用します。
string utcNow = DateTime.UtcNow.ToString("O");タイムゾーンやUTCオフセットを正確に保持したい場合は、DateTimeOffset.NowやDateTimeOffset.UtcNowの使用も検討します。
1-4. 指定した日付を文字列に変換する方法
任意の日付を指定する場合は、DateTimeのコンストラクターを使用します。
DateTime date = new DateTime(2026, 6, 20);string result = date.ToString("yyyy年MM月dd日");Console.WriteLine(result);
実行結果は次のとおりです。
2026年06月20日時刻まで指定する場合は、年、月、日、時、分、秒を順番に渡します。
DateTime dateTime = new DateTime(2026,6,20,14,5,9);string result = dateTime.ToString("yyyy/MM/dd HH:mm:ss");
実行結果は次のとおりです。
2026/06/20 14:05:092. C#の日付フォーマット指定子一覧
2-1. yyyy・MM・ddで年月日を表示する
年月日を表示するときに、よく使用する指定子は次のとおりです。
| 指定子 | 内容 | 表示例 |
|---|---|---|
yyyy | 4桁の年 | 2026 |
yy | 2桁の年 | 26 |
MM | 2桁の月 | 06 |
M | ゼロ埋めしない月 | 6 |
dd | 2桁の日 | 05 |
d | ゼロ埋めしない日 | 5 |
使用例は次のとおりです。
DateTime date = new DateTime(2026, 6, 5);Console.WriteLine(date.ToString("yyyy/MM/dd"));Console.WriteLine(date.ToString("yy/M/d"));
実行結果は次のようになります。
2026/06/0526/6/5MMは月を表します。小文字のmmは分を表すため、混同しないように注意が必要です。
2-2. HH・mm・ssで時刻を表示する
時刻を表示するときは、次の指定子を使用します。
| 指定子 | 内容 | 表示例 |
HH | 24時間表記の時 | 14 |
H | ゼロ埋めしない24時間表記の時 | 5 |
hh | 12時間表記の時 | 02 |
h | ゼロ埋めしない12時間表記の時 | 2 |
mm | 2桁の分 | 05 |
m | ゼロ埋めしない分 | 5 |
ss | 2桁の秒 | 09 |
s | ゼロ埋めしない秒 | 9 |
tt | 午前・午後 | 午前、午後、AM、PM |
DateTime time = new DateTime(2026, 6, 20, 14, 5, 9);Console.WriteLine(time.ToString("HH:mm:ss"));Console.WriteLine(time.ToString("hh:mm:ss tt"));
カルチャによって異なりますが、次のような結果になります。
14:05:0902:05:09 PM2-3. 曜日をddd・ddddで表示する
曜日は、dddまたはddddで表示できます。
| 指定子 | 内容 | 日本語の表示例 |
ddd | 曜日の省略名 | 土 |
dddd | 曜日の完全名 | 土曜日 |
using System.Globalization;DateTime date = new DateTime(2026, 6, 20);CultureInfo ja = new CultureInfo("ja-JP");
Console.WriteLine(date.ToString("ddd", ja));Console.WriteLine(date.ToString("dddd", ja));
実行結果は次のとおりです。
土土曜日英語で表示する場合は、en-USなどのカルチャを指定します。
CultureInfo en = new CultureInfo("en-US");Console.WriteLine(date.ToString("ddd", en));Console.WriteLine(date.ToString("dddd", en));
SatSaturday2-4. ミリ秒をfffで表示する
ミリ秒はfffで表示できます。
DateTime dateTime = new DateTime(2026,6,20,14,5,9,123);string result = dateTime.ToString("yyyy/MM/dd HH:mm:ss.fff");
Console.WriteLine(result);
実行結果は次のとおりです。
2026/06/20 14:05:09.123DateTimeはミリ秒より細かい精度も保持できます。fを増やすと、小数秒を最大7桁まで表示できます。
Console.WriteLine(dateTime.ToString("HH:mm:ss.fffffff"));fは末尾のゼロも表示し、Fは不要な末尾のゼロを省略します。
DateTime value = new DateTime(2026, 6, 20, 14, 5, 9, 120);Console.WriteLine(value.ToString("ss.fff"));Console.WriteLine(value.ToString("ss.FFF"));
09.12009.122-5. タイムゾーンをzzz・Kで表示する
zzzは、UTCからのオフセットを+09:00のような形式で表示します。
オフセットを確実に保持して表示したい場合は、DateTimeOffsetを使用するのが適切です。
DateTimeOffset dateTime = new DateTimeOffset(2026,6,20,14,5,9,TimeSpan.FromHours(9));string result = dateTime.ToString("yyyy-MM-ddTHH:mm:sszzz");
Console.WriteLine(result);
実行結果は次のとおりです。
2026-06-20T14:05:09+09:00Kは、DateTime.Kindに応じてタイムゾーン情報を表示する指定子です。
DateTime utc = DateTime.UtcNow;DateTime local = DateTime.Now;DateTime unspecified = DateTime.SpecifyKind(DateTime.Now,DateTimeKind.Unspecified);Console.WriteLine(utc.ToString("yyyy-MM-ddTHH:mm:ssK"));Console.WriteLine(local.ToString("yyyy-MM-ddTHH:mm:ssK"));Console.WriteLine(unspecified.ToString("yyyy-MM-ddTHH:mm:ssK"));
一般的に、UTCではZ、ローカル日時ではオフセット、Unspecifiedではタイムゾーン情報なしの文字列になります。
日時とUTCオフセットをセットで扱う必要がある場合は、DateTimeよりもDateTimeOffsetが分かりやすく安全です。
2-6. 1桁表示とゼロ埋め表示の違い
フォーマット指定子を1文字にするか2文字にするかで、ゼロ埋めの有無が変わります。
DateTime date = new DateTime(2026, 6, 5, 9, 4, 3);Console.WriteLine(date.ToString("yyyy/M/d H:m:s"));Console.WriteLine(date.ToString("yyyy/MM/dd HH:mm:ss"));
実行結果は次のとおりです。
2026/6/5 9:4:32026/06/05 09:04:03固定長のデータやログ、CSVではゼロ埋め形式が適しています。人が読む画面では、デザインに応じてゼロ埋めしない形式を使用することもあります。
3. よく使う日付フォーマットの変換例
3-1. yyyy/MM/dd形式に変換する
日本の業務システムでよく使われる形式です。
DateTime date = new DateTime(2026, 6, 20);string result = date.ToString("yyyy/MM/dd");Console.WriteLine(result);
2026/06/203-2. yyyy-MM-dd形式に変換する
HTMLの日付入力やデータ交換などでよく使われます。
DateTime date = new DateTime(2026, 6, 20);string result = date.ToString("yyyy-MM-dd");Console.WriteLine(result);
2026-06-20日付だけを表すISO 8601形式としても利用されます。
3-3. yyyyMMdd形式に変換する
スラッシュやハイフンを含まないため、ファイル名、識別子、並べ替え用の値などに使用できます。
DateTime date = new DateTime(2026, 6, 20);string result = date.ToString("yyyyMMdd");Console.WriteLine(result);
20260620年、月、日の順で固定長になっているため、文字列として並べ替えても日付順になります。
3-4. yyyy年MM月dd日形式に変換する
日本語の画面や帳票では、年月日を日本語で表示する形式がよく使われます。
DateTime date = new DateTime(2026, 6, 20);string result = date.ToString("yyyy年MM月dd日");Console.WriteLine(result);
2026年06月20日ゼロ埋めをしない場合は、Mとdを使用します。
string result = date.ToString("yyyy年M月d日");2026年6月20日3-5. yyyy/MM/dd HH:mm形式に変換する
日付と時刻を同時に表示するときの代表的な形式です。
DateTime dateTime = new DateTime(2026,6,20,14,5,9);string result = dateTime.ToString("yyyy/MM/dd HH:mm:ss");
Console.WriteLine(result);
2026/06/20 14:05:09ログや管理画面などで広く利用できます。ただし、タイムゾーン情報は含まれないため、複数の地域で扱うデータには注意が必要です。
3-6. ISO 8601形式に変換する
ISO 8601形式で出力する場合は、標準書式指定子のOを使用すると便利です。
using System.Globalization;DateTime utcNow = DateTime.UtcNow;
string result = utcNow.ToString("O",CultureInfo.InvariantCulture);
Console.WriteLine(result);
出力例は次のようになります。
2026-06-20T05:05:09.1234567ZDateTimeOffsetでもOを使用できます。
DateTimeOffset now = DateTimeOffset.Now;string result = now.ToString("O",CultureInfo.InvariantCulture);
2026-06-20T14:05:09.1234567+09:00外部APIとの通信では、UTCなら末尾がZの形式、ローカル時刻を送るならオフセット付きの形式が適しています。
3-7. ファイル名に使える日時文字列へ変換する
Windowsのファイル名には、/や:など使用できない文字があります。そのため、次のような形式に変換します。
DateTime now = DateTime.Now;string fileName = $"backup_{now:yyyyMMdd_HHmmss}.zip";
Console.WriteLine(fileName);
backup_20260620_140509.zip文字列補間では、変数名の後ろにコロンと書式を記述できます。
string result = $"{DateTime.Now:yyyyMMdd_HHmmss_fff}";ミリ秒を含めることで、短時間に複数ファイルを作成する場合の重複を減らせます。ただし、完全な一意性が必要な場合は、日時だけに頼らずGuidなども組み合わせます。
string fileName =$"data_{DateTime.UtcNow:yyyyMMdd_HHmmss_fff}_{Guid.NewGuid():N}.csv";4. 標準の日時書式指定文字列を使う方法
4-1. 短い日付形式「d」と長い日付形式「D」
標準書式指定子のdは短い日付形式、Dは長い日付形式を表します。
using System.Globalization;DateTime date = new DateTime(2026, 6, 20);CultureInfo ja = new CultureInfo("ja-JP");
Console.WriteLine(date.ToString("d", ja));Console.WriteLine(date.ToString("D", ja));
環境やカルチャ設定によって異なりますが、次のような形式になります。
2026/06/202026年6月20日土曜日標準書式の表示内容はカルチャに依存します。固定形式が必要な場合は、yyyy/MM/ddのようなカスタム書式を使用します。
4-2. 短い時刻形式「t」と長い時刻形式「T」
tは短い時刻形式、Tは秒を含む長い時刻形式です。
DateTime dateTime = new DateTime(2026,6,20,14,5,9);Console.WriteLine(dateTime.ToString("t"));Console.WriteLine(dateTime.ToString("T"));
出力例は次のようになります。
14:0514:05:09具体的な表示形式は、現在のカルチャに依存します。
4-3. 一般的な日時形式「g」と「G」
gは短い日付と短い時刻、Gは短い日付と長い時刻を組み合わせた形式です。
DateTime dateTime = new DateTime(2026,6,20,14,5,9);Console.WriteLine(dateTime.ToString("g"));Console.WriteLine(dateTime.ToString("G"));
出力例は次のとおりです。
2026/06/20 14:052026/06/20 14:05:094-4. ラウンドトリップ形式「O」
Oまたはoは、日時を高精度で保存し、再び日時型へ戻す用途に適したラウンドトリップ形式です。
using System.Globalization;DateTimeOffset original = DateTimeOffset.Now;
string text = original.ToString("O",CultureInfo.InvariantCulture);
DateTimeOffset restored = DateTimeOffset.Parse(text,CultureInfo.InvariantCulture,DateTimeStyles.RoundtripKind);
出力例は次のようになります。
2026-06-20T14:05:09.1234567+09:00API、設定ファイル、システム間連携など、日時を正確に復元したい場面で利用できます。
4-5. RFC 1123形式「R」
Rまたはrは、RFC 1123形式で日時を表示します。
using System.Globalization;DateTime utc = DateTime.UtcNow;
string result = utc.ToString("R",CultureInfo.InvariantCulture);
Console.WriteLine(result);
Sat, 20 Jun 2026 05:05:09 GMTRの文字列にはGMTが含まれます。ローカル日時を扱っている場合は、先にUTCへ変換してから出力します。
DateTime local = DateTime.Now;string result = local.ToUniversalTime().ToString("R", CultureInfo.InvariantCulture);
4-6. 並べ替え可能な形式「s」と「u」
sは、並べ替え可能な日時形式です。
DateTime dateTime = new DateTime(2026,6,20,14,5,9);Console.WriteLine(dateTime.ToString("s"));
2026-06-20T14:05:09年から秒まで大きい単位の順に並んでいるため、文字列としても日時順に並べ替えやすい形式です。ただし、タイムゾーン情報は含まれません。
uは、汎用の並べ替え可能な形式です。
DateTime utc = DateTime.UtcNow;Console.WriteLine(utc.ToString("u", CultureInfo.InvariantCulture));
2026-06-20 05:05:09Zローカル日時をuで出力するときは、先にToUniversalTime()でUTCへ変換するのが安全です。
string result = DateTime.Now.ToUniversalTime().ToString("u", CultureInfo.InvariantCulture);5. カルチャを指定して日付を文字列に変換する方法
5-1. CultureInfoを指定する理由
日付の表示形式や月名、曜日名、午前・午後の表記は、カルチャによって異なります。
DateTime date = new DateTime(2026, 6, 20);Console.WriteLine(date.ToString("D"));
カルチャを指定しない場合は、実行環境の現在のカルチャが使用されます。そのため、日本のPCと英語圏のサーバーで結果が異なる可能性があります。
表示言語を明確にしたい場合は、CultureInfoを明示します。
using System.Globalization;CultureInfo culture = new CultureInfo("ja-JP");string result = date.ToString("D", culture);
5-2. 日本語形式で日付を表示する
日本語の月日や曜日を表示する場合は、ja-JPを指定します。
using System.Globalization;DateTime date = new DateTime(2026, 6, 20);CultureInfo ja = new CultureInfo("ja-JP");
string result = date.ToString("yyyy年M月d日(dddd)",ja);
Console.WriteLine(result);
2026年6月20日(土曜日)OSや実行環境による標準形式の差を避けたい場合は、Dではなく具体的なカスタム書式を指定します。
5-3. 英語形式で月名や曜日を表示する
英語の月名や曜日を表示する場合は、en-USやen-GBを使用します。
using System.Globalization;DateTime date = new DateTime(2026, 6, 20);CultureInfo en = new CultureInfo("en-US");
string result = date.ToString("MMMM d, yyyy (dddd)",en);
Console.WriteLine(result);
June 20, 2026 (Saturday)月名に関する主な指定子は次のとおりです。
| 指定子 | 内容 | 表示例 |
MMM | 月の省略名 | Jun |
MMMM | 月の完全名 | June |
Console.WriteLine(date.ToString("MMM", en));Console.WriteLine(date.ToString("MMMM", en));5-4. InvariantCultureで環境依存を防ぐ
CultureInfo.InvariantCultureは、特定の国や地域に依存しないカルチャです。
using System.Globalization;DateTime date = new DateTime(2026,6,20,14,5,9);
string result = date.ToString("yyyy-MM-dd HH:mm:ss",CultureInfo.InvariantCulture);
固定形式のログ、CSV、APIデータ、データベース連携などでは、InvariantCultureを指定すると環境による表示差を防ぎやすくなります。
string apiValue = DateTimeOffset.UtcNow.ToString("O",CultureInfo.InvariantCulture);人に見せる文字列では利用者のカルチャを使用し、機械処理用の文字列ではInvariantCultureを使用するという分け方が基本です。
5-5. 和暦で日付を表示する
和暦で表示する場合は、JapaneseCalendarを指定した日本語カルチャを使用します。
using System.Globalization;DateTime date = new DateTime(2026, 6, 20);
CultureInfo culture = new CultureInfo("ja-JP");culture.DateTimeFormat.Calendar = new JapaneseCalendar();
string result = date.ToString("gg y年M月d日",culture);
Console.WriteLine(result);
令和 8年6月20日主な指定子は次のとおりです。
| 指定子 | 内容 |
gg | 元号 |
y | 元号年 |
M | 月 |
d | 日 |
元年を「1年」と表示するか「元年」と表示するかなど、結果がOSや.NETの実行環境に依存する場合があります。帳票仕様で厳密な表記が必要な場合は、実際の利用環境で確認します。
5-6. 実行環境によって表示結果が変わる原因
日付文字列が開発環境と本番環境で異なる主な原因は、現在のカルチャに依存した書式を使用していることです。
string result = DateTime.Now.ToString();このコードの結果は、次の設定によって変わる可能性があります。
OSの言語と地域設定
CurrentCulture実行ユーザーの設定
サーバーやコンテナのロケール
.NETランタイムやOSが持つカルチャデータ
固定形式が必要な場所では、書式とカルチャを明示します。
using System.Globalization;string result = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fff'Z'",CultureInfo.InvariantCulture);
一方、利用者向けの画面では、利用者の言語設定に合わせたカルチャを指定します。
6. 文字列からDateTime型へ変換する方法
6-1. DateTime.Parseの使い方
DateTime.Parseは、日付を表す文字列をDateTime型へ変換します。
string text = "2026/06/20";DateTime date = DateTime.Parse(text);Console.WriteLine(date.Year);Console.WriteLine(date.Month);Console.WriteLine(date.Day);
2026620ただし、文字列が日付として解釈できない場合は、FormatExceptionが発生します。
string text = "日付ではない文字列";DateTime date = DateTime.Parse(text);外部入力やユーザー入力では、例外を避けられるTryParseを優先するのが一般的です。
6-2. DateTime.TryParseで安全に変換する
DateTime.TryParseは、変換に成功したかどうかをbool型で返します。
string text = "2026/06/20";if (DateTime.TryParse(text, out DateTime date)){Console.WriteLine(date.ToString("yyyy-MM-dd"));}else{Console.WriteLine("日付に変換できません。");}
変換できない場合でも例外が発生しないため、フォーム入力やCSVの読み込みなどに適しています。
カルチャを明示することもできます。
using System.Globalization;string text = "June 20, 2026";CultureInfo en = new CultureInfo("en-US");
bool success = DateTime.TryParse(text,en,DateTimeStyles.None,out DateTime date);
6-3. DateTime.ParseExactで書式を指定する
DateTime.ParseExactは、指定した書式と完全に一致する文字列だけを変換します。
using System.Globalization;string text = "20260620";
DateTime date = DateTime.ParseExact(text,"yyyyMMdd",CultureInfo.InvariantCulture);
Console.WriteLine(date.ToString("yyyy/MM/dd"));
2026/06/20入力形式が異なる場合は、FormatExceptionが発生します。
DateTime date = DateTime.ParseExact("2026/06/20","yyyyMMdd",CultureInfo.InvariantCulture);入力データの形式を厳密にチェックしたい場合に適しています。
6-4. DateTime.TryParseExactで例外を防ぐ
TryParseExactを使用すると、指定した形式に一致しない場合でも例外が発生しません。
using System.Globalization;string text = "20260620";
bool success = DateTime.TryParseExact(text,"yyyyMMdd",CultureInfo.InvariantCulture,DateTimeStyles.None,out DateTime date);
if (success){Console.WriteLine(date.ToString("yyyy/MM/dd"));}else{Console.WriteLine("指定された形式ではありません。");}
ユーザー入力や外部ファイルを扱う場合は、ParseExactよりもTryParseExactのほうが安全です。
6-5. 複数の日付フォーマットを受け付ける方法
TryParseExactには、複数の書式を配列で渡すオーバーロードがあります。
using System.Globalization;string[] formats ={"yyyy/MM/dd","yyyy-MM-dd","yyyyMMdd"};
string text = "2026-06-20";
bool success = DateTime.TryParseExact(text,formats,CultureInfo.InvariantCulture,DateTimeStyles.None,out DateTime date);
if (success){Console.WriteLine(date.ToString("yyyy/MM/dd"));}
この例では、次の3形式を受け付けます。
2026/06/202026-06-2020260620受け付ける形式を明示できるため、自由な形式を解釈するTryParseよりも入力仕様を管理しやすくなります。
6-6. 変換できない文字列を判定する方法
変換できるかどうかだけを確認する場合も、TryParseまたはTryParseExactを使用します。
string input = "2026/02/30";bool isValid = DateTime.TryParse(input,out _);
Console.WriteLine(isValid);
2月30日は存在しないため、結果はfalseになります。
厳密な形式も確認する場合は、次のように記述します。
using System.Globalization;static bool IsValidDate(string input){return DateTime.TryParseExact(input,"yyyy/MM/dd",CultureInfo.InvariantCulture,DateTimeStyles.None,out _);}
Console.WriteLine(IsValidDate("2026/06/20"));Console.WriteLine(IsValidDate("2026-06-20"));Console.WriteLine(IsValidDate("2026/02/30"));TrueFalseFalse7. DateTimeOffset・タイムゾーンを含む日時の文字列変換
7-1. DateTimeとDateTimeOffsetの違い
DateTimeは日付と時刻に加えて、KindプロパティでUTC、ローカル、未指定の区別を持ちます。
DateTime utc = DateTime.UtcNow;Console.WriteLine(utc.Kind);
Utc一方、DateTimeOffsetは、日付と時刻にUTCからのオフセットを組み合わせて保持します。
DateTimeOffset value = new DateTimeOffset(2026,6,20,14,5,9,TimeSpan.FromHours(9));Console.WriteLine(value.Offset);
09:00:00複数のタイムゾーンで利用するシステム、API通信、イベントの発生時刻などでは、DateTimeOffsetが適しています。
ただし、+09:00というオフセットだけでは「Asia/Tokyo」のようなタイムゾーンIDや夏時間の規則までは保持できません。地域のタイムゾーン自体が必要な場合は、タイムゾーンIDも別に保存します。
7-2. UTC日時を文字列に変換する
UTC日時をISO 8601形式へ変換する例は次のとおりです。
using System.Globalization;DateTime utc = DateTime.UtcNow;
string result = utc.ToString("yyyy-MM-ddTHH:mm:ss.fff'Z'",CultureInfo.InvariantCulture);
Console.WriteLine(result);
2026-06-20T05:05:09.123Z'Z'はUTCを表す文字です。この形式を使用する場合は、変換元が本当にUTCであることを確認します。
より簡単に、ラウンドトリップ形式を使うこともできます。
string result = DateTime.UtcNow.ToString("O",CultureInfo.InvariantCulture);7-3. ローカル日時をUTCへ変換して表示する
ローカル日時は、ToUniversalTimeでUTCへ変換できます。
using System.Globalization;DateTime local = DateTime.Now;DateTime utc = local.ToUniversalTime();
string result = utc.ToString("O",CultureInfo.InvariantCulture);
Console.WriteLine(result);
日時のKindがUnspecifiedの場合、ToUniversalTime()はその値をローカル日時として解釈します。どのタイムゾーンの時刻か明確でないデータを変換する場合は、TimeZoneInfoを使用して変換元のタイムゾーンを明示します。
DateTime unspecified = DateTime.SpecifyKind(new DateTime(2026, 6, 20, 14, 0, 0),DateTimeKind.Unspecified);TimeZoneInfo sourceTimeZone =TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
DateTime utc = TimeZoneInfo.ConvertTimeToUtc(unspecified,sourceTimeZone);
タイムゾーンIDはOSによって異なることがあるため、対象環境で利用できるIDを確認する必要があります。
7-4. オフセット付きの日時文字列を作成する
オフセット付きの文字列は、DateTimeOffsetとzzzを使用して作成できます。
using System.Globalization;DateTimeOffset value = DateTimeOffset.Now;
string result = value.ToString("yyyy-MM-ddTHH:mm:ss.fffzzz",CultureInfo.InvariantCulture);
Console.WriteLine(result);
2026-06-20T14:05:09.123+09:00標準書式のOを使う方法もあります。
string result = DateTimeOffset.Now.ToString("O",CultureInfo.InvariantCulture);オフセット付き文字列を読み込む場合も、DateTimeOffsetを使用します。
string text = "2026-06-20T14:05:09+09:00";DateTimeOffset value = DateTimeOffset.Parse(text,CultureInfo.InvariantCulture);
7-5. APIやデータベースで推奨される日時形式
APIで日時を文字列として送る場合は、ISO 8601形式が一般的です。
UTCで統一する例は次のとおりです。
using System.Globalization;string timestamp = DateTimeOffset.UtcNow.ToString("O",CultureInfo.InvariantCulture);
2026-06-20T05:05:09.1234567+00:00末尾をZにしたい場合は、UTCのDateTimeを使用できます。
string timestamp = DateTime.UtcNow.ToString("O",CultureInfo.InvariantCulture);データベースでは、可能であれば日時を文字列ではなく、日時用のデータ型へ保存します。
SQL Serverであれば、用途に応じてdatetime2やdatetimeoffsetなどを使用します。文字列で保存すると、並べ替え、範囲検索、入力チェック、タイムゾーン管理が複雑になるためです。
基本的な使い分けは次のとおりです。
データベース内部では日時型として保存する
APIではISO 8601形式を使う
複数地域で扱う発生時刻はUTCで保存する
元のオフセットが必要なら
DateTimeOffsetを使う画面表示の直前に利用者のタイムゾーンへ変換する
8. 日付の文字列変換でよくあるエラーと対処法
8-1. MMとmmを間違える
大文字のMMは月、小文字のmmは分です。
DateTime date = new DateTime(2026,6,20,14,5,9);Console.WriteLine(date.ToString("yyyy/MM/dd"));Console.WriteLine(date.ToString("yyyy/mm/dd"));
実行結果は次のようになります。
2026/06/202026/05/202つ目は月ではなく分が出力されているため、05になります。
年月日の月にはMM、時分秒の分にはmmを使用します。
8-2. HHとhhを間違える
HHは24時間表記、hhは12時間表記です。
DateTime date = new DateTime(2026,6,20,14,5,9);Console.WriteLine(date.ToString("HH:mm"));Console.WriteLine(date.ToString("hh:mm"));
14:0502:05hhを使用すると、午前か午後か分からなくなります。12時間表記の場合は、ttも付けます。
Console.WriteLine(date.ToString("hh:mm tt"));02:05 PM8-3. yyyyとYYYYの違いを理解する
C#のカスタム日時書式で4桁の年を表す指定子は、小文字のyyyyです。
DateTime date = new DateTime(2026, 6, 20);Console.WriteLine(date.ToString("yyyy/MM/dd"));
2026/06/20大文字のYYYYは、C#のDateTimeにおける年の書式指定子ではありません。
Console.WriteLine(date.ToString("YYYY/MM/dd"));意図した年に変換されず、YYYYがそのまま文字として出力される可能性があります。
YYYY/06/20他のプログラミング言語や日時ライブラリでは、大文字のYが週基準年を表すことがあります。しかし、C#のDateTime.ToStringで西暦年を表示する場合は、yyyyを使用します。
8-4. nullのDateTimeを変換してエラーになる
通常のDateTimeは値型なので、nullにはなりません。ただし、DateTime?またはNullable<DateTime>はnullを保持できます。
DateTime? date = null;Valueへ直接アクセスすると例外が発生します。
string result = date.Value.ToString("yyyy/MM/dd");null条件演算子とnull合体演算子を使用すると安全に変換できます。
string result =date?.ToString("yyyy/MM/dd") ?? "";未設定であることを明示する場合は、代替文字列を指定します。
string result =date?.ToString("yyyy/MM/dd") ?? "未設定";8-5. 存在しない日付をParseして例外が発生する
次の文字列は実在しない日付です。
string text = "2026/02/30";DateTime.Parseを使用すると、FormatExceptionが発生します。
DateTime date = DateTime.Parse(text);外部入力では、TryParseを使用します。
if (!DateTime.TryParse(text, out DateTime date)){Console.WriteLine("存在しない日付です。");}形式も限定する場合は、TryParseExactを使用します。
using System.Globalization;bool success = DateTime.TryParseExact(text,"yyyy/MM/dd",CultureInfo.InvariantCulture,DateTimeStyles.None,out DateTime date);
8-6. カルチャの違いで月日が逆になる
次の文字列は、カルチャによって意味が異なります。
06/07/2026en-USでは6月7日、en-GBでは7月6日として解釈される可能性があります。
using System.Globalization;string text = "06/07/2026";
DateTime usDate = DateTime.Parse(text,new CultureInfo("en-US"));
DateTime gbDate = DateTime.Parse(text,new CultureInfo("en-GB"));
曖昧さを避けるには、yyyy-MM-ddなど年月日の順番が明確な形式を採用し、ParseExactまたはTryParseExactで変換します。
DateTime date = DateTime.ParseExact("2026-06-07","yyyy-MM-dd",CultureInfo.InvariantCulture);8-7. タイムゾーン情報が失われる
次の文字列には、タイムゾーン情報が含まれていません。
2026-06-20 14:00:00この文字列だけでは、東京の14時なのかUTCの14時なのか判断できません。
タイムゾーンを含める場合は、UTCまたはオフセット付きの形式を使用します。
2026-06-20T05:00:00Z2026-06-20T14:00:00+09:00C#では、DateTimeOffsetを使用するとオフセットを保持できます。
DateTimeOffset value = DateTimeOffset.Now;string text = value.ToString("O");文字列をDateTimeで読み込むと、変換方法によってローカル日時へ調整されたり、オフセットが失われたりすることがあります。オフセットを保持する必要がある場合は、DateTimeOffset.ParseまたはDateTimeOffset.TryParseを使用します。
9. 実務で使える日付文字列変換のサンプル
9-1. 画面表示用の日付を生成する
利用者向けの画面では、読みやすい日本語形式が適しています。
using System.Globalization;DateTime date = new DateTime(2026, 6, 20);CultureInfo ja = new CultureInfo("ja-JP");
string displayText = date.ToString("yyyy年M月d日(ddd)",ja);
Console.WriteLine(displayText);
2026年6月20日(土)画面表示では、固定形式よりも利用者の言語や地域設定に合わせる方法もあります。
string displayText = date.ToString("D",CultureInfo.CurrentCulture);9-2. ログ出力用の日時を生成する
ログでは、日時順に並べやすい固定長の形式が便利です。
using System.Globalization;string timestamp = DateTimeOffset.Now.ToString("yyyy-MM-dd HH:mm:ss.fff zzz",CultureInfo.InvariantCulture);
string log = $"{timestamp} [INFO] 処理を開始しました。";
Console.WriteLine(log);
2026-06-20 14:05:09.123 +09:00 [INFO] 処理を開始しました。複数の地域にあるサーバーのログを集約する場合は、UTCに統一すると比較しやすくなります。
string timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fff'Z'",CultureInfo.InvariantCulture);9-3. CSV出力用の日付を生成する
CSVでは、列の意味に応じて書式を統一します。
using System.Globalization;DateTime orderDate = new DateTime(2026,6,20,14,5,9);
string dateValue = orderDate.ToString("yyyy-MM-dd",CultureInfo.InvariantCulture);
string dateTimeValue = orderDate.ToString("yyyy-MM-dd HH:mm:ss",CultureInfo.InvariantCulture);
表計算ソフトに読み込ませる場合、環境によって文字列が自動的に日付へ変換されることがあります。年月日の解釈差を減らすには、仕様として書式を明確に定義します。
機械的な受け渡しでは、次のようなISO 8601形式も適しています。
string csvValue = DateTimeOffset.UtcNow.ToString("O",CultureInfo.InvariantCulture);9-4. URLやファイル名用の日時を生成する
URLやファイル名では、使用できない記号を避けます。
string value = DateTime.UtcNow.ToString("yyyyMMdd_HHmmss");20260620_050509ファイル名へ組み込む例は次のとおりです。
string fileName =$"report_{DateTime.Now:yyyyMMdd_HHmmss}.csv";URLのクエリパラメーターとして日付を送る場合は、単純で曖昧さのない形式を使います。
string date = DateTime.Today.ToString("yyyy-MM-dd");string url = $"/reports?targetDate={date}";
日時全体をURLへ含める場合は、ISO 8601文字列をURLエンコードします。
string timestamp = DateTimeOffset.UtcNow.ToString("O");string encoded = Uri.EscapeDataString(timestamp);string url = $"/events?from={encoded}";
9-5. API送信用のISO 8601文字列を生成する
API送信用の日時は、UTCに統一したISO 8601形式が扱いやすい方法です。
using System.Globalization;string timestamp = DateTime.UtcNow.ToString("O",CultureInfo.InvariantCulture);
2026-06-20T05:05:09.1234567ZDateTimeOffsetを使用する場合は、次のように記述します。
string timestamp = DateTimeOffset.UtcNow.ToString("O",CultureInfo.InvariantCulture);2026-06-20T05:05:09.1234567+00:00JSONシリアライザーを利用している場合は、自分で日時文字列を組み立てるより、DateTimeやDateTimeOffsetのままモデルへ設定し、シリアライザーに変換を任せる方法が安全です。
public sealed class EventRequest{public DateTimeOffset OccurredAt { get; init; }}var request = new EventRequest{OccurredAt = DateTimeOffset.UtcNow};
APIの仕様書で小数秒の桁数、UTC、オフセットの扱いが決められている場合は、その仕様を優先します。
9-6. DateTime?のnullを考慮して変換する
DateTime?を画面表示用に変換する例は次のとおりです。
DateTime? completedAt = null;string result = completedAt?.ToString("yyyy/MM/dd HH:mm") ?? "未完了";
Console.WriteLine(result);
値がある場合は日付を表示し、nullの場合は「未完了」と表示します。
空文字に変換したい場合は、次のように記述します。
string result =completedAt?.ToString("yyyy/MM/dd") ?? string.Empty;条件演算子を使用する方法もあります。
string result = completedAt.HasValue? completedAt.Value.ToString("yyyy/MM/dd"): string.Empty;9-7. 拡張メソッドで日付変換処理を共通化する
同じ書式変換を複数の場所で使用する場合は、拡張メソッドとして共通化できます。
using System.Globalization;public static class DateTimeExtensions{public static string ToDisplayDate(this DateTime value){return value.ToString("yyyy/MM/dd",CultureInfo.InvariantCulture);}
public static string ToLogTimestamp(this DateTimeOffset value){return value.ToString("yyyy-MM-dd HH:mm:ss.fff zzz",CultureInfo.InvariantCulture);}public static string ToIso8601Utc(this DateTimeOffset value){return value.ToUniversalTime().ToString("O",CultureInfo.InvariantCulture);}public static string ToDisplayDateOrEmpty(this DateTime? value){return value?.ToString("yyyy/MM/dd",CultureInfo.InvariantCulture) ?? string.Empty;}
}
次のように呼び出せます。
DateTime date = new DateTime(2026, 6, 20);DateTimeOffset timestamp = DateTimeOffset.Now;DateTime? nullableDate = null;Console.WriteLine(date.ToDisplayDate());Console.WriteLine(timestamp.ToLogTimestamp());Console.WriteLine(timestamp.ToIso8601Utc());Console.WriteLine(nullableDate.ToDisplayDateOrEmpty());
ただし、すべての日時変換を無条件に共通化すると、画面、ログ、APIなど用途ごとの違いが分かりにくくなることがあります。メソッド名に用途を含め、どの形式へ変換されるか明確にします。
10. C#の日付と文字列変換に関するよくある質問
10-1. DateTime.ToStringでゼロ埋めするには?
月、日、時、分、秒を2桁で指定します。
DateTime date = new DateTime(2026,6,5,9,4,3);string result = date.ToString("yyyy/MM/dd HH:mm:ss");
Console.WriteLine(result);
2026/06/05 09:04:03主なゼロ埋め指定子は、MM、dd、HH、mm、ssです。
10-2. 月や日をゼロ埋めせずに表示するには?
月にはM、日にはdを使用します。
DateTime date = new DateTime(2026, 6, 5);string result = date.ToString("yyyy/M/d");
Console.WriteLine(result);
2026/6/5ただし、dを単独で指定すると標準書式の「短い日付形式」として扱われます。日だけをゼロ埋めせずに表示したい場合は、%dと記述します。
Console.WriteLine(date.ToString("%d"));5月だけの場合も同様です。
Console.WriteLine(date.ToString("%M"));10-3. 曜日を日本語で表示するには?
ja-JPカルチャとdddまたはddddを使用します。
using System.Globalization;DateTime date = new DateTime(2026, 6, 20);CultureInfo ja = new CultureInfo("ja-JP");
Console.WriteLine(date.ToString("ddd", ja));Console.WriteLine(date.ToString("dddd", ja));
土土曜日年月日と組み合わせることもできます。
string result = date.ToString("yyyy年M月d日(dddd)",ja);10-4. 24時間表記と12時間表記を切り替えるには?
24時間表記ではHH、12時間表記ではhhを使用します。
DateTime time = new DateTime(2026,6,20,14,5,0);Console.WriteLine(time.ToString("HH:mm"));Console.WriteLine(time.ToString("hh:mm tt"));
14:0502:05 PM日本語の午前・午後を表示する場合は、ja-JPカルチャを指定します。
using System.Globalization;CultureInfo ja = new CultureInfo("ja-JP");
string result = time.ToString("tt h時mm分",ja);
午後 2時05分10-5. DateOnlyやTimeOnlyを文字列に変換するには?
日付だけを扱うDateOnlyも、ToStringで文字列に変換できます。
using System.Globalization;DateOnly date = new DateOnly(2026, 6, 20);
string result = date.ToString("yyyy/MM/dd",CultureInfo.InvariantCulture);
Console.WriteLine(result);
2026/06/20時刻だけを扱うTimeOnlyも同様です。
TimeOnly time = new TimeOnly(14, 5, 9);string result = time.ToString("HH:mm:ss",CultureInfo.InvariantCulture);
Console.WriteLine(result);
14:05:09文字列から変換する場合は、ParseやTryParseExactを使用できます。
bool success = DateOnly.TryParseExact("2026-06-20","yyyy-MM-dd",CultureInfo.InvariantCulture,DateTimeStyles.None,out DateOnly date);bool success = TimeOnly.TryParseExact("14:05:09","HH:mm:ss",CultureInfo.InvariantCulture,DateTimeStyles.None,out TimeOnly time);日付だけが必要な値にDateTimeを使用すると、不要な時刻情報まで持つことになります。誕生日、締切日、営業日など、タイムゾーンに依存しない日付にはDateOnlyが適しています。
10-6. DateTimeの書式を共通設定する方法はある?
アプリケーション全体のカルチャは、CultureInfo.CurrentCultureなどで設定できます。
using System.Globalization;CultureInfo.DefaultThreadCurrentCulture =new CultureInfo("ja-JP");
CultureInfo.DefaultThreadCurrentUICulture =new CultureInfo("ja-JP");
ただし、アプリケーション全体のカルチャを変更すると、日付だけでなく数値や通貨の書式にも影響します。
特定の日時書式を共通化したい場合は、定数、フォーマッター、拡張メソッドなどを使用する方法が分かりやすいでしょう。
public static class DateFormats{public const string DisplayDate = "yyyy/MM/dd";public const string LogDateTime ="yyyy-MM-dd HH:mm:ss.fff";public const string FileNameDateTime ="yyyyMMdd_HHmmss";}string result = DateTime.Now.ToString(DateFormats.DisplayDate);形式を変更する可能性がある場合は、定数へまとめるだけでなく、用途別のメソッドにする方法もあります。
public static string FormatDisplayDate(DateTime value){return value.ToString("yyyy/MM/dd");}10-7. 保存用と画面表示用でフォーマットを分けるべき?
保存用と画面表示用のフォーマットは、分けるのが基本です。
画面表示は、人が読みやすく、利用者の言語や地域に合った形式が適しています。
string displayValue = date.ToString("yyyy年M月d日(ddd)",new CultureInfo("ja-JP"));APIやファイルなどの保存・連携用データは、環境に依存せず、機械的に解釈しやすい形式が適しています。
string storageValue = dateTimeOffset.ToUniversalTime().ToString("O",CultureInfo.InvariantCulture);データベースへ保存する場合は、文字列へ変換せず日時型のカラムへ保存する方法を優先します。
用途ごとの代表的な形式は次のとおりです。
| 用途 | 推奨例 |
| 日本語の画面表示 | yyyy年M月d日 |
| 一覧画面 | yyyy/MM/dd HH:mm |
| ログ | yyyy-MM-dd HH:mm:ss.fff zzz |
| ファイル名 | yyyyMMdd_HHmmss |
| API | ISO 8601のO形式 |
| データベース | 日時用データ型 |
| 日付だけのデータ交換 | yyyy-MM-dd |
まとめ
C#で日付を文字列に変換する基本的な方法は、DateTime.ToStringメソッドへ書式指定文字列を渡すことです。
string result = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");年月日にはyyyy、MM、dd、時分秒にはHH、mm、ssを使用します。特に、月を表すMMと分を表すmmは間違えやすいため注意が必要です。
表示結果を実行環境に依存させたくない場合は、書式とCultureInfoを明示します。
using System.Globalization;string result = DateTime.UtcNow.ToString("O",CultureInfo.InvariantCulture);
文字列から日付へ変換する場合は、入力エラーで例外が発生しないDateTime.TryParseやDateTime.TryParseExactが便利です。
bool success = DateTime.TryParseExact(input,"yyyy/MM/dd",CultureInfo.InvariantCulture,DateTimeStyles.None,out DateTime date);また、タイムゾーンやUTCオフセットを含む日時を扱う場合は、DateTimeOffsetを使用すると情報の欠落を防ぎやすくなります。
C#の日付と文字列の変換では、すべての用途に同じフォーマットを使うのではなく、画面表示、ログ、CSV、ファイル名、API、データベースなど、目的に応じて形式を使い分けることが重要です。

