C# DateTimeをStringに変換する方法|ToStringの書式指定・Parse・よくあるエラーを徹底解説
はじめに
C#で日時を扱うとき、DateTimeをstringに変換したい場面は非常に多くあります。たとえば、画面に「2026/06/06」のように表示したい場合、ログに「2026-06-06 14:30:15」のような固定形式で出力したい場合、ファイル名に「20260606143015」のような日時を含めたい場合などです。
C#でDateTimeをstringに変換する基本は、ToStringメソッドを使うことです。
C#DateTime now = DateTime.Now;
string text = now.ToString("yyyy/MM/dd HH:mm:ss");
Console.WriteLine(text);
一方で、DateTime.ToString()は書式指定やカルチャ、タイムゾーン、12時間表記と24時間表記の違いなどを理解していないと、意図しない文字列になることがあります。また、stringからDateTimeへ戻す場合には、Parse、TryParse、ParseExact、TryParseExactの使い分けも重要です。
この記事では、C#のDateTimeとstringの変換について、基本的な使い方から実務でよく使う書式、エラー対策、APIやログでの注意点まで詳しく解説します。
1. C#でDateTimeをStringに変換する基本
1-1. DateTimeとstringの違い
DateTimeは、日付と時刻を表すための型です。年、月、日、時、分、秒、ミリ秒などの情報を持ち、日付の比較や加算、減算といった計算に使えます。
C#DateTime date = new DateTime(2026, 6, 6, 14, 30, 0);
DateTime nextDay = date.AddDays(1);
bool isPast = date < DateTime.Now;
一方、stringは文字列です。画面表示、CSV出力、ログ出力、ファイル名、JSONなど、人間や外部システムが読みやすい形で日時を表現するために使います。
C#string text = "2026/06/06 14:30:00";
重要なのは、DateTimeは日時として計算できる値であり、stringは表示や出力のための文字列であるという点です。
日付の比較や計算を行う前に文字列へ変換してしまうと、処理が複雑になったり、並び順が意図しない結果になったりします。そのため、内部処理ではDateTimeを使い、表示や出力の直前でstringに変換するのが基本です。
1-2. DateTimeを文字列に変換するならToStringを使う
C#でDateTimeをstringに変換する最も基本的な方法は、ToStringメソッドです。
C#DateTime date = new DateTime(2026, 6, 6, 14, 30, 0);
string text = date.ToString();
Console.WriteLine(text);
ただし、引数なしのToString()は実行環境のカルチャ、つまりPCやサーバーの地域設定の影響を受けます。そのため、日本語環境では日本向けの形式、英語環境では英語圏向けの形式になることがあります。
実務では、次のように書式を指定して変換することが多いです。
C#string text = date.ToString("yyyy/MM/dd HH:mm:ss");
このように書くと、2026/06/06 14:30:00のような固定形式の文字列を作成できます。
1-3. ToStringの基本構文と最小サンプルコード
DateTime.ToStringの基本構文は次の通りです。
C#dateTime.ToString("書式");
たとえば、日付だけをyyyy/MM/dd形式で文字列にする場合は、次のように書きます。
C#DateTime date = new DateTime(2026, 6, 6);
string result = date.ToString("yyyy/MM/dd");
Console.WriteLine(result);
出力結果は次のようになります。
2026/06/06
時刻を含める場合は、HH:mm:ssを追加します。
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
yyyyは4桁の年、MMは2桁の月、ddは2桁の日、HHは24時間表記の時、mmは分、ssは秒を表します。
1-4. 現在日時を文字列に変換する方法
現在日時を文字列に変換するには、DateTime.Nowを使います。
C#DateTime now = DateTime.Now;
string text = now.ToString("yyyy/MM/dd HH:mm:ss");
Console.WriteLine(text);
日付だけが必要な場合は、次のようにします。
C#string today = DateTime.Now.ToString("yyyy/MM/dd");
時刻だけが必要な場合は、次のようにします。
C#string time = DateTime.Now.ToString("HH:mm:ss");
ログやファイル名に使う場合は、区切り文字を含めない形式もよく使われます。
C#string timestamp = DateTime.Now.ToString("yyyyMMddHHmmss");
出力例は次のようになります。
20260606143015
この形式は、ファイル名やIDの一部に使いやすく、文字列として並べ替えたときにも時系列順になりやすいというメリットがあります。
1-5. 変換後の文字列が用途によって変わる理由
同じDateTimeでも、用途によって適切な文字列形式は異なります。
画面表示では、ユーザーにとって読みやすい形式が向いています。
C#date.ToString("yyyy年MM月dd日");
ログでは、後から検索やソートがしやすい固定形式が向いています。
C#date.ToString("yyyy-MM-dd HH:mm:ss.fff");
ファイル名では、/や:のような使えない文字を避ける必要があります。
C#date.ToString("yyyyMMddHHmmss");
API連携では、ISO 8601形式がよく使われます。
C#date.ToString("o");
つまり、DateTimeをstringに変換するときは、「どこで使う文字列なのか」を先に決めることが重要です。画面用、保存用、連携用、ファイル名用では、適切なフォーマットが異なります。
2. ToStringでDateTimeの表示形式を指定する方法
2-1. 書式指定なしのToStringと環境依存の注意点
DateTime.ToString()を引数なしで呼び出すと、現在のカルチャに基づいた形式で文字列化されます。
C#DateTime date = new DateTime(2026, 6, 6, 14, 30, 0);
string text = date.ToString();
Console.WriteLine(text);
日本語環境では次のような結果になることがあります。
2026/06/06 14:30:00
英語環境では次のような形式になる可能性があります。
6/6/2026 2:30:00 PM
このように、書式指定なしのToString()は環境によって結果が変わる可能性があります。
画面表示だけであれば問題にならないこともありますが、ログ、CSV、API、ファイル名、データ連携で使う場合は、書式を明示するのが安全です。
C#string text = date.ToString("yyyy-MM-dd HH:mm:ss");
固定形式が必要な場面では、さらにCultureInfo.InvariantCultureを指定すると安定します。
C#using System.Globalization;
string text = date.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);
2-2. 標準日時書式指定子の使い方
DateTime.ToStringでは、標準日時書式指定子を使うことができます。標準日時書式指定子は、"d"や"D"、"g"、"O"のような1文字の指定子です。
C#DateTime date = new DateTime(2026, 6, 6, 14, 30, 15);
Console.WriteLine(date.ToString("d"));
Console.WriteLine(date.ToString("D"));
Console.WriteLine(date.ToString("t"));
Console.WriteLine(date.ToString("T"));
Console.WriteLine(date.ToString("g"));
Console.WriteLine(date.ToString("G"));
代表的な標準書式指定子は次の通りです。
| 指定子 | 意味 | 例 |
|---|---|---|
d | 短い日付 | 2026/06/06 |
D | 長い日付 | 2026年6月6日 |
t | 短い時刻 | 14:30 |
T | 長い時刻 | 14:30:15 |
f | 長い日付 + 短い時刻 | 2026年6月6日 14:30 |
F | 長い日付 + 長い時刻 | 2026年6月6日 14:30:15 |
g | 短い日付 + 短い時刻 | 2026/06/06 14:30 |
G | 短い日付 + 長い時刻 | 2026/06/06 14:30:15 |
O / o | ラウンドトリップ形式 | 2026-06-06T14:30:15.0000000 |
s | ソート可能形式 | 2026-06-06T14:30:15 |
u | UTCのソート可能形式 | 2026-06-06 14:30:15Z |
標準書式指定子は簡単に使えますが、カルチャによって出力が変わるものもあります。ログやAPIのように固定形式が必要な場合は、カスタム日時書式指定子を使う方が明確です。
2-3. カスタム日時書式指定子の使い方
カスタム日時書式指定子を使うと、出力したい形式を細かく指定できます。
C#DateTime date = new DateTime(2026, 6, 6, 14, 30, 15);
string text = date.ToString("yyyy/MM/dd HH:mm:ss");
Console.WriteLine(text);
出力結果は次の通りです。
2026/06/06 14:30:15
主なカスタム書式指定子は次の通りです。
| 指定子 | 意味 |
|---|---|
yyyy | 4桁の年 |
yy | 2桁の年 |
MM | 2桁の月 |
M | 1桁または2桁の月 |
dd | 2桁の日 |
d | 1桁または2桁の日 |
HH | 24時間表記の時 |
hh | 12時間表記の時 |
mm | 2桁の分 |
ss | 2桁の秒 |
fff | ミリ秒 |
dddd | 曜日名 |
MMM | 省略月名 |
MMMM | 月名 |
たとえば、日本語の表示にしたい場合は次のようにできます。
C#string text = date.ToString("yyyy年MM月dd日 HH時mm分ss秒");
出力例は次の通りです。
2026年06月06日 14時30分15秒
2-4. yyyy/MM/dd形式で日付だけを文字列にする
日付だけをyyyy/MM/dd形式にするには、次のように書きます。
C#DateTime date = new DateTime(2026, 6, 6, 14, 30, 15);
string text = date.ToString("yyyy/MM/dd");
Console.WriteLine(text);
出力結果は次の通りです。
2026/06/06
この形式は、日本の業務システムや画面表示でよく使われます。
月や日をゼロ埋めしたくない場合は、Mやdを使います。
C#string text = date.ToString("yyyy/M/d");
出力例は次の通りです。
2026/6/6
固定桁で扱いたい場合はyyyy/MM/dd、人間が自然に読む表示にしたい場合はyyyy/M/dのように使い分けます。
2-5. HH:mm:ss形式で時刻だけを文字列にする
時刻だけを文字列にするには、HH:mm:ssを使います。
C#DateTime date = new DateTime(2026, 6, 6, 14, 30, 15);
string text = date.ToString("HH:mm:ss");
Console.WriteLine(text);
出力結果は次の通りです。
14:30:15
秒が不要な場合は、HH:mmで十分です。
C#string text = date.ToString("HH:mm");
12時間表記にしたい場合は、hh:mm:ssを使います。ただし、午前・午後を区別するためにttも付けるのが一般的です。
C#string text = date.ToString("tt hh:mm:ss");
日本語環境では、次のような出力になります。
午後 02:30:15
実務では、誤解を避けるために24時間表記のHH:mm:ssを使うことが多いです。
2-6. yyyy-MM-dd HH:mm:ss形式で日時を文字列にする
日時を固定形式で扱いたい場合、yyyy-MM-dd HH:mm:ssは非常によく使われます。
C#DateTime date = new DateTime(2026, 6, 6, 14, 30, 15);
string text = date.ToString("yyyy-MM-dd HH:mm:ss");
Console.WriteLine(text);
出力結果は次の通りです。
2026-06-06 14:30:15
この形式は、ログ、CSV、管理画面、デバッグ出力などで扱いやすい形式です。
ただし、API連携や国際的なデータ交換では、yyyy-MM-ddTHH:mm:ssのように日付と時刻の間にTを入れるISO 8601形式が使われることが多いです。
C#string text = date.ToString("yyyy-MM-ddTHH:mm:ss");
より厳密に扱う場合は、標準書式指定子"o"を検討します。
C#string text = date.ToString("o");
2-7. yyyyMMddやyyyyMMddHHmmss形式でファイル名・ID用に変換する
ファイル名やIDの一部に日時を使いたい場合は、/や:を含めない形式にします。
C#DateTime now = DateTime.Now;
string dateText = now.ToString("yyyyMMdd");
string timestamp = now.ToString("yyyyMMddHHmmss");
Console.WriteLine(dateText);
Console.WriteLine(timestamp);
出力例は次の通りです。
20260606
20260606143015
Windowsのファイル名では、:や/など使えない文字があります。そのため、次のような形式はファイル名には向きません。
C#string badFileName = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
ファイル名に使うなら、次のようにします。
C#string fileName = $"log_{DateTime.Now:yyyyMMddHHmmss}.txt";
出力例は次の通りです。
log_20260606143015.txt
ミリ秒まで含める場合は、fffを追加します。
C#string fileName = $"log_{DateTime.Now:yyyyMMddHHmmssfff}.txt";
2-8. ミリ秒・曜日・月名を含めて文字列にする
ミリ秒を含めるには、fffを使います。
C#DateTime date = new DateTime(2026, 6, 6, 14, 30, 15, 123);
string text = date.ToString("yyyy-MM-dd HH:mm:ss.fff");
Console.WriteLine(text);
出力結果は次の通りです。
2026-06-06 14:30:15.123
曜日を含める場合は、dddまたはddddを使います。
C#string text = date.ToString("yyyy/MM/dd dddd");
日本語環境では次のような出力になります。
2026/06/06 土曜日
月名を表示したい場合は、MMMまたはMMMMを使います。
C#using System.Globalization;
string text = date.ToString("MMMM dd, yyyy", new CultureInfo("en-US"));
Console.WriteLine(text);
出力例は次の通りです。
June 06, 2026
曜日名や月名はカルチャの影響を受けるため、日本語で表示したいのか、英語で表示したいのかを明確にしてCultureInfoを指定するのが安全です。
3. DateTimeの書式指定子一覧と使い分け
3-1. 年を表すy・yy・yyyyの違い
年を表す書式指定子には、y、yy、yyyyなどがあります。
C#DateTime date = new DateTime(2026, 6, 6);
Console.WriteLine(date.ToString("yyyy"));
Console.WriteLine(date.ToString("yy"));
出力結果は次の通りです。
2026
26
yyyyは4桁の年、yyは下2桁の年です。
実務では、基本的にyyyyを使うことをおすすめします。yyは短く表示できますが、26が1926年なのか2026年なのか分かりにくくなるためです。
なお、yを単独で使う場合は標準日時書式指定子として解釈される点に注意が必要です。カスタム指定子として1文字だけ使いたい場合は、%yのように書きます。
C#Console.WriteLine(date.ToString("%y"));
3-2. 月を表すM・MM・MMM・MMMMの違い
月を表す指定子は、大文字のMです。
C#DateTime date = new DateTime(2026, 6, 6);
Console.WriteLine(date.ToString("M"));
Console.WriteLine(date.ToString("MM"));
Console.WriteLine(date.ToString("MMM"));
Console.WriteLine(date.ToString("MMMM"));
ただし、"M"を単独で指定すると標準書式指定子として扱われ、月日パターンになります。カスタム指定子として月だけを表示したい場合は、"%M"を使います。
C#Console.WriteLine(date.ToString("%M"));
Console.WriteLine(date.ToString("MM"));
代表的な違いは次の通りです。
| 指定子 | 意味 | 例 |
|---|---|---|
%M | 1桁または2桁の月 | 6 |
MM | 2桁の月 | 06 |
MMM | 省略月名 | Jun、6月など |
MMMM | 月名 | June、6月など |
MMMやMMMMはカルチャによって結果が変わります。英語の月名を出したい場合は、CultureInfo("en-US")などを指定します。
C#using System.Globalization;
string text = date.ToString("MMMM", new CultureInfo("en-US"));
3-3. 日を表すd・ddと標準書式dの違い
日を表すカスタム指定子は、dまたはddです。
C#DateTime date = new DateTime(2026, 6, 6);
Console.WriteLine(date.ToString("%d"));
Console.WriteLine(date.ToString("dd"));
出力結果は次の通りです。
6
06
注意点は、"d"を単独で指定すると、カスタム指定子ではなく標準日時書式指定子として扱われることです。
C#Console.WriteLine(date.ToString("d"));
この場合は、短い日付形式になります。
2026/06/06
カスタム指定子として日だけを表示したい場合は、"%d"を使います。
C#Console.WriteLine(date.ToString("%d"));
この違いは混乱しやすいので、yyyy/MM/ddのように複数の指定子を組み合わせて使うのが一般的です。
3-4. 時を表すH・HH・h・hhの違い
時を表す指定子には、24時間表記のH、HHと、12時間表記のh、hhがあります。
C#DateTime date = new DateTime(2026, 6, 6, 14, 5, 0);
Console.WriteLine(date.ToString("%H"));
Console.WriteLine(date.ToString("HH"));
Console.WriteLine(date.ToString("%h"));
Console.WriteLine(date.ToString("hh"));
出力例は次の通りです。
14
14
2
02
違いを整理すると次のようになります。
| 指定子 | 意味 | 例 |
|---|---|---|
%H | 24時間表記、ゼロ埋めなし | 14 |
HH | 24時間表記、2桁 | 14 |
%h | 12時間表記、ゼロ埋めなし | 2 |
hh | 12時間表記、2桁 | 02 |
12時間表記を使う場合は、午前・午後を表すttを一緒に使うと分かりやすくなります。
C#string text = date.ToString("tt hh:mm");
実務では、ログやデータ連携では24時間表記のHHを使うことが多いです。
3-5. 分を表すm・mmと月のMMを間違えやすい理由
C#の日時書式で非常に多いミスが、月のMMと分のmmを間違えることです。
月は大文字のMです。
C#date.ToString("yyyy/MM/dd");
分は小文字のmです。
C#date.ToString("HH:mm:ss");
たとえば、次のコードは間違いです。
C#string text = date.ToString("yyyy/mm/dd");
この場合、mmは月ではなく分として扱われます。そのため、期待していた月ではなく、分の値が表示されます。
正しくは次の通りです。
C#string text = date.ToString("yyyy/MM/dd");
日時全体を書く場合は、次のように大文字と小文字を明確に使い分けます。
C#string text = date.ToString("yyyy-MM-dd HH:mm:ss");
MMは月、mmは分。この違いは必ず覚えておきましょう。
3-6. 秒・ミリ秒・小数秒の指定方法
秒はsまたはssで表します。
C#DateTime date = new DateTime(2026, 6, 6, 14, 30, 5, 123);
Console.WriteLine(date.ToString("%s"));
Console.WriteLine(date.ToString("ss"));
出力結果は次の通りです。
5
05
ミリ秒はfffを使います。
C#string text = date.ToString("yyyy-MM-dd HH:mm:ss.fff");
出力結果は次の通りです。
2026-06-06 14:30:05.123
小数秒の指定には、fやFも使えます。
C#Console.WriteLine(date.ToString("HH:mm:ss.f"));
Console.WriteLine(date.ToString("HH:mm:ss.ff"));
Console.WriteLine(date.ToString("HH:mm:ss.fff"));
fは指定した桁を必ず表示します。一方、Fは末尾の不要なゼロを省略します。
C#DateTime date = new DateTime(2026, 6, 6, 14, 30, 5, 120);
Console.WriteLine(date.ToString("HH:mm:ss.fff"));
Console.WriteLine(date.ToString("HH:mm:ss.FFF"));
出力例は次の通りです。
14:30:05.120
14:30:05.12
ログで桁数を固定したい場合は、fffを使うのがおすすめです。
3-7. よく使うDateTime ToString書式の早見表
実務でよく使うDateTime.ToStringの書式をまとめると、次のようになります。
| 用途 | 書式 | 出力例 |
|---|---|---|
| 日付のみ | yyyy/MM/dd | 2026/06/06 |
| 日付のみ、ハイフン | yyyy-MM-dd | 2026-06-06 |
| 時刻のみ | HH:mm:ss | 14:30:15 |
| 日時 | yyyy/MM/dd HH:mm:ss | 2026/06/06 14:30:15 |
| ログ向け日時 | yyyy-MM-dd HH:mm:ss.fff | 2026-06-06 14:30:15.123 |
| ファイル名向け | yyyyMMddHHmmss | 20260606143015 |
| 日付ID向け | yyyyMMdd | 20260606 |
| ISO 8601風 | yyyy-MM-ddTHH:mm:ss | 2026-06-06T14:30:15 |
| ラウンドトリップ形式 | o | 2026-06-06T14:30:15.0000000 |
| 日本語表示 | yyyy年MM月dd日 | 2026年06月06日 |
| 曜日付き | yyyy/MM/dd dddd | 2026/06/06 土曜日 |
迷った場合は、画面表示ならyyyy/MM/dd、ログならyyyy-MM-dd HH:mm:ss.fff、ファイル名ならyyyyMMddHHmmss、APIならoまたはISO 8601形式を選ぶとよいでしょう。
4. CultureInfoを指定して日時文字列を安定させる
4-1. PCの地域設定によってToStringの結果が変わるケース
DateTime.ToString()や一部の標準書式指定子は、現在のカルチャの影響を受けます。
C#DateTime date = new DateTime(2026, 6, 6, 14, 30, 0);
Console.WriteLine(date.ToString("D"));
日本語環境では、次のような出力になります。
2026年6月6日
英語環境では、次のような出力になることがあります。
Saturday, June 6, 2026
このように、同じコードでも実行環境によって文字列が変わる場合があります。
ユーザーの地域に合わせた画面表示では便利ですが、ログ、CSV、API、テストコードでは問題になることがあります。環境に依存させたくない場合は、CultureInfoを明示しましょう。
4-2. CultureInfo.InvariantCultureを使うべき場面
CultureInfo.InvariantCultureは、特定の国や地域に依存しないカルチャです。ログ、CSV、API、ファイル名、内部的な文字列変換など、環境によって結果を変えたくない場面で使います。
C#using System.Globalization;
DateTime date = new DateTime(2026, 6, 6, 14, 30, 15);
string text = date.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);
Console.WriteLine(text);
出力結果は次の通りです。
2026-06-06 14:30:15
カスタム書式のyyyy-MM-dd HH:mm:ssだけであれば、数字部分は大きく変わりません。しかし、曜日名や月名、午前午後表記を含める場合は、カルチャによって出力が変わります。
C#string text = date.ToString("dddd, MMMM dd, yyyy", CultureInfo.InvariantCulture);
固定的な英語ベースの表現が必要な場合にも、InvariantCultureは有効です。
4-3. 日本語表示にCultureInfo ja-JPを指定する方法
日本語の曜日や月名を明示的に出したい場合は、CultureInfo("ja-JP")を指定します。
C#using System.Globalization;
DateTime date = new DateTime(2026, 6, 6, 14, 30, 15);
string text = date.ToString("yyyy年MM月dd日 dddd HH時mm分", new CultureInfo("ja-JP"));
Console.WriteLine(text);
出力結果は次の通りです。
2026年06月06日 土曜日 14時30分
サーバーのカルチャが英語になっていても、ja-JPを指定すれば日本語の曜日表示になります。
Webアプリでは、開発環境と本番環境でサーバーの地域設定が異なる場合があります。日本向けサービスで表示を安定させたい場合は、CultureInfo("ja-JP")を明示すると安心です。
4-4. 英語の曜日・月名を表示する方法
英語の曜日や月名を表示したい場合は、CultureInfo("en-US")などを指定します。
C#using System.Globalization;
DateTime date = new DateTime(2026, 6, 6, 14, 30, 15);
string text = date.ToString("dddd, MMMM dd, yyyy", new CultureInfo("en-US"));
Console.WriteLine(text);
出力結果は次の通りです。
Saturday, June 06, 2026
省略形の曜日や月名を使う場合は、dddやMMMを使います。
C#string text = date.ToString("ddd, MMM dd, yyyy", new CultureInfo("en-US"));
出力例は次の通りです。
Sat, Jun 06, 2026
英語圏向けの画面表示、メール、帳票などでは、カルチャを明示しておくと表示が安定します。
4-5. 和暦表示を行う場合の考え方
C#で和暦表示を行う場合は、ja-JPカルチャと日本の暦を使います。
C#using System.Globalization;
DateTime date = new DateTime(2026, 6, 6);
CultureInfo culture = new CultureInfo("ja-JP");
culture.DateTimeFormat.Calendar = new JapaneseCalendar();
string text = date.ToString("gg y年M月d日", culture);
Console.WriteLine(text);
出力例は次のようになります。
令和 8年6月6日
和暦では、元号が変わる可能性があります。そのため、古い実行環境や更新されていない環境では、新しい元号に正しく対応できない可能性があります。
和暦は人間向けの表示には便利ですが、内部保存やAPI連携、データベース保存には西暦のDateTimeやISO 8601形式を使う方が安全です。
4-6. Webアプリ・API・ログでカルチャ指定が重要な理由
WebアプリやAPIでは、開発環境、本番環境、コンテナ、クラウド環境でカルチャ設定が異なることがあります。そのため、ToString()の結果に依存したコードを書くと、環境差による不具合が起きる可能性があります。
特に注意すべき場面は次の通りです。
| 場面 | 推奨 |
|---|---|
| 画面表示 | ユーザーの言語や地域に合わせる |
| ログ出力 | 固定形式 + InvariantCulture |
| CSV出力 | 固定形式 + InvariantCulture |
| API連携 | ISO 8601形式 |
| ファイル名 | yyyyMMddHHmmssなど安全な形式 |
| DB保存 | 文字列ではなく日時型で保存 |
たとえば、ログ出力では次のように固定形式にします。
C#using System.Globalization;
string logTime = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture);
API連携では、タイムゾーン情報も含めやすいDateTimeOffsetや"o"形式を検討します。
C#string apiTime = DateTimeOffset.UtcNow.ToString("o", CultureInfo.InvariantCulture);
5. StringからDateTimeへ変換する方法
5-1. DateTime.Parseで文字列をDateTimeに変換する
stringからDateTimeへ変換する基本的な方法は、DateTime.Parseです。
C#string text = "2026/06/06 14:30:15";
DateTime date = DateTime.Parse(text);
Console.WriteLine(date);
Parseは、文字列を解析してDateTimeに変換します。ただし、入力文字列が不正な場合は例外が発生します。
C#string text = "not date";
DateTime date = DateTime.Parse(text);
このような場合、FormatExceptionが発生します。
ユーザー入力や外部ファイルの値など、正しい日時文字列である保証がない場合は、ParseではなくTryParseを使うのが安全です。
5-2. DateTime.TryParseで変換失敗時のエラーを防ぐ
DateTime.TryParseを使うと、変換に失敗しても例外が発生しません。戻り値のboolで成功・失敗を判定できます。
C#string text = "2026/06/06 14:30:15";
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("日付として認識できません");
}
ユーザー入力、CSV読み込み、外部APIのレスポンスなど、変換できない可能性があるデータにはTryParseを使いましょう。
5-3. DateTime.ParseExactで書式を指定して変換する
入力文字列の形式が決まっている場合は、ParseExactを使います。
C#using System.Globalization;
string text = "20260606";
DateTime date = DateTime.ParseExact(
text,
"yyyyMMdd",
CultureInfo.InvariantCulture
);
Console.WriteLine(date);
ParseExactは、指定した書式と文字列が完全に一致する場合だけ変換します。
たとえば、次のようにyyyyMMddを指定した場合、20260606は変換できます。
C#string text = "20260606";
DateTime date = DateTime.ParseExact(text, "yyyyMMdd", CultureInfo.InvariantCulture);
しかし、2026/06/06は書式が一致しないため失敗します。
C#string text = "2026/06/06";
DateTime date = DateTime.ParseExact(text, "yyyyMMdd", CultureInfo.InvariantCulture);
ParseExactは失敗時に例外を投げるため、入力値が不正な可能性がある場合はTryParseExactを使います。
5-4. TryParseExactで安全に書式指定変換する
TryParseExactは、書式を指定しつつ、変換失敗時に例外を発生させない方法です。
C#using System.Globalization;
string text = "20260606";
bool success = DateTime.TryParseExact(
text,
"yyyyMMdd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date
);
if (success)
{
Console.WriteLine($"変換成功: {date}");
}
else
{
Console.WriteLine("変換失敗");
}
ユーザー入力やCSVなど、形式が決まっているが不正値が混ざる可能性がある場合に向いています。
C#string text = "20261340";
if (DateTime.TryParseExact(
text,
"yyyyMMdd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("不正な日付です");
}
この例では、13月40日という存在しない日付なので変換に失敗します。
5-5. yyyyMMddのような区切り文字なしの日付を変換する
yyyyMMddのような区切り文字なしの日付は、Parseでは環境や文字列によってうまく認識できないことがあります。そのため、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
時刻まで含むyyyyMMddHHmmss形式も同じように変換できます。
C#string text = "20260606143015";
DateTime date = DateTime.ParseExact(
text,
"yyyyMMddHHmmss",
CultureInfo.InvariantCulture
);
Console.WriteLine(date.ToString("yyyy/MM/dd HH:mm:ss"));
出力結果は次の通りです。
2026/06/06 14:30:15
ファイル名やIDから日時を復元する場合にも、この方法が使えます。
5-6. 複数の入力形式に対応してDateTimeへ変換する
複数の日時形式を受け付けたい場合は、TryParseExactに書式の配列を渡します。
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("変換できませんでした");
}
このコードでは、次のような入力に対応できます。
2026/06/06
2026-06-06
20260606
ただし、受け付ける形式を増やしすぎると、想定外の入力を許してしまう可能性があります。ユーザー入力では便利ですが、APIやCSVなど仕様が決まっている場合は、できるだけ形式を固定した方が安全です。
5-7. Parse・TryParse・ParseExact・TryParseExactの使い分け
DateTimeへの変換メソッドは、用途によって使い分けます。
| メソッド | 特徴 | 失敗時 | 向いている場面 |
|---|---|---|---|
Parse | 柔軟に変換 | 例外 | 必ず正しい文字列と分かっている場合 |
TryParse | 柔軟に変換 | false | ユーザー入力など不正値の可能性がある場合 |
ParseExact | 書式を厳密に指定 | 例外 | 必ず指定形式と分かっている場合 |
TryParseExact | 書式を厳密に指定 | false | 指定形式だが不正値の可能性がある場合 |
実務では、外部から入ってくる文字列にはTryParseまたはTryParseExactを使うのが基本です。
特に、CSV、フォーム入力、ファイル名、APIレスポンスなどでは、次のようにTryParseExactで安全に変換することをおすすめします。
C#using System.Globalization;
if (DateTime.TryParseExact(
input,
"yyyy-MM-dd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
// 変換成功
}
else
{
// エラー処理
}
6. C# DateTimeとString変換の実用例
6-1. 画面表示用の日付文字列を作成する
画面表示では、ユーザーにとって読みやすい形式にすることが重要です。
C#DateTime date = new DateTime(2026, 6, 6);
string displayText = date.ToString("yyyy年MM月dd日");
Console.WriteLine(displayText);
出力結果は次の通りです。
2026年06月06日
曜日も表示する場合は、次のようにします。
C#using System.Globalization;
string displayText = date.ToString(
"yyyy年MM月dd日 dddd",
new CultureInfo("ja-JP")
);
Console.WriteLine(displayText);
出力例は次の通りです。
2026年06月06日 土曜日
画面表示では、ユーザーの言語や地域に合わせたフォーマットを選びましょう。
6-2. CSV出力用にDateTimeを文字列化する
CSV出力では、後からExcelや他システムで読み込むことを考えて、形式を統一することが重要です。
C#using System.Globalization;
DateTime createdAt = new DateTime(2026, 6, 6, 14, 30, 15);
string csvDate = createdAt.ToString(
"yyyy-MM-dd HH:mm:ss",
CultureInfo.InvariantCulture
);
Console.WriteLine(csvDate);
出力結果は次の通りです。
2026-06-06 14:30:15
CSVでは、環境によって解釈が変わりにくい形式にしておくと安全です。
C#string line = $"{id},{name},{createdAt:yyyy-MM-dd HH:mm:ss}";
ただし、文字列補間でカルチャまで厳密に指定したい場合は、先にToStringで変換してからCSV行を作ると分かりやすくなります。
C#string createdAtText = createdAt.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);
string line = $"{id},{name},{createdAtText}";
6-3. ログ出力用に日時を固定形式で保存する
ログ出力では、検索しやすく、ソートしやすく、ミリ秒まで確認できる形式が便利です。
C#using System.Globalization;
string logTime = DateTime.Now.ToString(
"yyyy-MM-dd HH:mm:ss.fff",
CultureInfo.InvariantCulture
);
Console.WriteLine($"[{logTime}] 処理を開始しました");
出力例は次の通りです。
[2026-06-06 14:30:15.123] 処理を開始しました
サーバーやクラウド環境では、ローカル時刻ではなくUTCでログを出すこともあります。
C#string logTime = DateTime.UtcNow.ToString(
"yyyy-MM-dd HH:mm:ss.fff",
CultureInfo.InvariantCulture
);
UTCであることを明示したい場合は、Zを付ける形式もあります。
C#string logTime = DateTime.UtcNow.ToString(
"yyyy-MM-ddTHH:mm:ss.fffZ",
CultureInfo.InvariantCulture
);
6-4. ファイル名に使える日時文字列を作る
ファイル名に日時を含める場合は、/や:を避ける必要があります。
C#string fileName = $"backup_{DateTime.Now:yyyyMMddHHmmss}.zip";
Console.WriteLine(fileName);
出力例は次の通りです。
backup_20260606143015.zip
ミリ秒まで含めたい場合は、fffを追加します。
C#string fileName = $"backup_{DateTime.Now:yyyyMMddHHmmssfff}.zip";
日付ごとのフォルダを作る場合は、次のようにできます。
C#string folderName = DateTime.Now.ToString("yyyyMMdd");
string fileName = $"log_{DateTime.Now:HHmmss}.txt";
ファイル名に使う日時は、並び替えやすいように、年、月、日、時、分、秒の順にするのがおすすめです。
6-5. JSON・APIで扱いやすいISO 8601形式に変換する
JSONやAPIで日時を扱う場合は、ISO 8601形式がよく使われます。C#では、"o"指定子を使うとラウンドトリップ形式の文字列にできます。
C#using System.Globalization;
DateTime now = DateTime.UtcNow;
string text = now.ToString("o", CultureInfo.InvariantCulture);
Console.WriteLine(text);
出力例は次のようになります。
2026-06-06T05:30:15.1234567Z
タイムゾーンを含めて扱いたい場合は、DateTimeOffsetが便利です。
C#DateTimeOffset now = DateTimeOffset.UtcNow;
string text = now.ToString("o", CultureInfo.InvariantCulture);
Console.WriteLine(text);
API連携では、ローカル時刻なのかUTCなのかが曖昧だと不具合の原因になります。可能であれば、UTCまたはオフセット付きの日時を使いましょう。
6-6. データベース保存時に文字列変換すべきでないケース
データベースに日時を保存する場合、基本的にはstringではなく、日時型のカラムに保存すべきです。
たとえば、SQL Serverであればdatetime2、PostgreSQLであればtimestampやtimestamptzなど、データベース側の日時型を使うのが一般的です。
C#側でも、パラメータにはDateTimeのまま渡します。
C#using var command = connection.CreateCommand();
command.CommandText = "INSERT INTO Logs (CreatedAt) VALUES (@CreatedAt)";
var parameter = command.CreateParameter();
parameter.ParameterName = "@CreatedAt";
parameter.Value = DateTime.UtcNow;
command.Parameters.Add(parameter);
日時を文字列として保存すると、次のような問題が起きやすくなります。
| 問題 | 内容 |
|---|---|
| 比較しにくい | 文字列比較になり、日付順にならない場合がある |
| 計算しにくい | 日数差や月単位の集計が面倒 |
| 形式が混在する | yyyy/MM/ddとMM/dd/yyyyが混ざる可能性 |
| タイムゾーンが曖昧 | UTCかローカル時刻か分からなくなる |
表示用に文字列化するのは問題ありませんが、保存や検索、集計に使う値はDateTimeのまま扱うのが基本です。
6-7. nullable DateTimeを空文字や指定形式に変換する
DateTime?、つまりnullableなDateTimeを文字列に変換する場合は、nullチェックが必要です。
C#DateTime? date = null;
string text = date.HasValue
? date.Value.ToString("yyyy/MM/dd")
: "";
Console.WriteLine(text);
C#では、null条件演算子とnull合体演算子を使って短く書くこともできます。
C#DateTime? date = DateTime.Now;
string text = date?.ToString("yyyy/MM/dd") ?? "";
nullの場合にハイフンを表示したいなら、次のようにします。
C#string text = date?.ToString("yyyy/MM/dd") ?? "-";
画面表示では空文字や-、CSVでは空欄、APIではnullなど、用途に応じて扱いを決めるとよいでしょう。
7. DateTimeとString変換でよくあるエラーと対処法
7-1. 「String was not recognized as a valid DateTime」の原因
String was not recognized as a valid DateTimeは、文字列をDateTimeに変換できなかったときに発生する代表的なエラーです。
C#string text = "abc";
DateTime date = DateTime.Parse(text);
このコードでは、abcが日付として解釈できないため、FormatExceptionが発生します。
主な原因は次の通りです。
| 原因 | 例 |
|---|---|
| 日付形式が不正 | abc |
| 存在しない日付 | 2026/02/30 |
| 書式が合っていない | 20260606をyyyy/MM/ddとして解析 |
| カルチャが合っていない | 06/07/2026の月日解釈 |
| 空文字 | "" |
| null | null |
外部入力を扱う場合は、ParseではなくTryParseやTryParseExactを使いましょう。
C#if (DateTime.TryParse(text, out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("日付として変換できません");
}
7-2. 「文字列は有効なDateTimeとして認識されませんでした」の対処法
日本語環境では、同じエラーが「文字列は有効なDateTimeとして認識されませんでした」のように表示されることがあります。
対処法は、入力の形式を確認し、必要に応じてTryParseExactを使うことです。
C#using System.Globalization;
string text = "20260606";
if (DateTime.TryParseExact(
text,
"yyyyMMdd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("日付形式が正しくありません");
}
ユーザーに入力してもらう場合は、期待する形式を画面に表示すると親切です。
日付は yyyy/MM/dd 形式で入力してください。
例: 2026/06/06
また、エラーが起きた文字列をログに残すと、原因調査がしやすくなります。
C#Console.WriteLine($"日付変換に失敗しました。input={text}");
7-3. MMとmmを間違えて月・分の表示がおかしくなるケース
DateTime.ToStringで最も多いミスのひとつが、MMとmmの間違いです。
間違った例です。
C#DateTime date = new DateTime(2026, 6, 6, 14, 30, 15);
string text = date.ToString("yyyy/mm/dd");
Console.WriteLine(text);
この場合、mmは月ではなく分を表します。そのため、次のような意図しない結果になります。
2026/30/06
正しくは、月に大文字のMMを使います。
C#string text = date.ToString("yyyy/MM/dd");
時刻の分には、小文字のmmを使います。
C#string text = date.ToString("HH:mm:ss");
覚え方は次の通りです。
MM = Month(月)
mm = minute(分)
7-4. 12時間表記と24時間表記を間違えるケース
時を表す指定子には、HHとhhがあります。
HHは24時間表記です。
C#date.ToString("HH:mm:ss");
hhは12時間表記です。
C#date.ToString("hh:mm:ss");
たとえば、14時30分をhh:mm:ssで表示すると、次のようになります。
02:30:15
これだけでは午前2時なのか午後2時なのか分かりません。12時間表記を使うなら、ttを付けましょう。
C#string text = date.ToString("tt hh:mm:ss");
出力例は次の通りです。
午後 02:30:15
ログやAPI、データ保存では、誤解を避けるために24時間表記のHH:mm:ssを使うのがおすすめです。
7-5. カルチャ違いでParseに失敗するケース
日付文字列の解釈はカルチャによって変わります。
たとえば、次の文字列は、日本では「2026年6月7日」と解釈するかもしれません。
06/07/2026
しかし、英語圏では「2026年6月7日」または「2026年7月6日」のように、地域によって解釈が変わる可能性があります。
このような曖昧な形式を避けるには、ParseExactまたはTryParseExactで形式を明示します。
C#using System.Globalization;
string text = "06/07/2026";
DateTime date = DateTime.ParseExact(
text,
"MM/dd/yyyy",
new CultureInfo("en-US")
);
日本向けのyyyy/MM/ddとして解析するなら、次のようにします。
C#DateTime date = DateTime.ParseExact(
text,
"yyyy/MM/dd",
new CultureInfo("ja-JP")
);
APIやCSVでは、曖昧なMM/dd/yyyyやdd/MM/yyyyよりも、yyyy-MM-ddやISO 8601形式を使う方が安全です。
7-6. null・空文字・不正な日付文字列を扱う方法
nullや空文字をそのままDateTime.Parseに渡すと、例外の原因になります。
C#string text = "";
DateTime date = DateTime.Parse(text);
安全に処理するには、先にstring.IsNullOrWhiteSpaceで確認します。
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? date = null;
if (!string.IsNullOrWhiteSpace(text) &&
DateTime.TryParse(text, out DateTime parsed))
{
date = parsed;
}
フォーム入力やCSVでは、空欄を許可するのか、不正値としてエラーにするのかを事前に決めておくことが重要です。
7-7. DateTime型とstring型を直接代入できない理由
DateTimeとstringは別の型なので、直接代入することはできません。
C#DateTime date = DateTime.Now;
// コンパイルエラー
string text = date;
DateTimeをstringにするには、ToStringを使います。
C#string text = date.ToString("yyyy/MM/dd");
逆に、stringをDateTimeにするには、ParseやTryParseを使います。
C#string text = "2026/06/06";
DateTime date = DateTime.Parse(text);
安全に変換するなら、次のようにします。
C#if (DateTime.TryParse(text, out DateTime date))
{
Console.WriteLine(date);
}
型が違うということは、役割が違うということです。日時の計算や比較にはDateTime、表示や出力にはstringを使いましょう。
7-8. 日付の比較や計算前に文字列化してしまう問題
日付を比較したり計算したりする前に文字列化すると、不具合の原因になります。
悪い例です。
C#string date1 = "2026/6/10";
string date2 = "2026/6/2";
Console.WriteLine(date1.CompareTo(date2));
文字列として比較すると、日付順ではなく文字の並びとして比較されます。そのため、期待通りの結果にならないことがあります。
正しくは、DateTimeとして比較します。
C#DateTime date1 = new DateTime(2026, 6, 10);
DateTime date2 = new DateTime(2026, 6, 2);
if (date1 > date2)
{
Console.WriteLine("date1の方が後の日付です");
}
日数差を計算する場合も、DateTimeのまま扱います。
C#TimeSpan diff = date1 - date2;
Console.WriteLine(diff.Days);
文字列化は、画面表示や出力の直前に行うのが基本です。
8. DateTime変換で押さえたい注意点
8-1. 表示用の文字列と内部処理用のDateTimeを分ける
DateTimeとstringの変換で最も重要なのは、表示用と内部処理用を分けることです。
内部処理ではDateTimeを使います。
C#DateTime createdAt = DateTime.Now;
DateTime expiredAt = createdAt.AddDays(30);
画面表示や出力のタイミングでstringに変換します。
C#string displayText = createdAt.ToString("yyyy/MM/dd");
データベースやAPIの内部処理で文字列を多用すると、比較、検索、集計、タイムゾーン処理が難しくなります。
基本方針は次の通りです。
内部処理: DateTime / DateTimeOffset
表示・出力: string
この方針を守るだけで、日時関連の不具合を大幅に減らせます。
8-2. タイムゾーンを扱う場合はDateTimeOffsetも検討する
DateTimeは日時を扱うための基本的な型ですが、タイムゾーンやUTCオフセットを明確に扱う場合は、DateTimeOffsetも検討しましょう。
C#DateTimeOffset now = DateTimeOffset.Now;
string text = now.ToString("o");
Console.WriteLine(text);
出力例は次のようになります。
2026-06-06T14:30:15.1234567+09:00
+09:00のようなオフセットが含まれるため、その日時がどのタイムゾーン基準なのか分かりやすくなります。
複数の国や地域で使うWebサービス、API、ログ基盤では、DateTimeだけでなくDateTimeOffsetを使った方が安全な場合があります。
8-3. UTCとローカル時刻の違いに注意する
DateTime.Nowはローカル時刻を返します。
C#DateTime localNow = DateTime.Now;
一方、DateTime.UtcNowはUTC時刻を返します。
C#DateTime utcNow = DateTime.UtcNow;
日本時間は通常UTCより9時間進んでいるため、NowとUtcNowでは値が異なります。
ログやAPI連携では、サーバーのローカル時刻に依存すると環境差が出る場合があります。そのため、システム内部ではUTCで扱い、画面表示時にユーザーのタイムゾーンへ変換する設計がよく使われます。
C#DateTime utcNow = DateTime.UtcNow;
string text = utcNow.ToString("yyyy-MM-ddTHH:mm:ssZ");
ただし、Zを付ける場合は、その日時が本当にUTCであることを確認してください。ローカル時刻にZを付けると、誤った意味になります。
8-4. API連携ではISO 8601形式を優先する
APIで日時を送受信する場合は、ISO 8601形式を優先しましょう。
C#string text = DateTimeOffset.UtcNow.ToString("o");
出力例は次の通りです。
2026-06-06T05:30:15.1234567+00:00
DateTimeを使う場合も、"o"指定子を使うことでラウンドトリップしやすい形式になります。
C#string text = DateTime.UtcNow.ToString("o");
APIで避けたい形式は、地域によって解釈が変わる形式です。
06/07/2026
この形式は、6月7日なのか7月6日なのかが曖昧です。APIでは、次のような形式の方が安全です。
2026-06-07T00:00:00Z
8-5. 日付フォーマットをアプリ全体で統一する
アプリ内で日付フォーマットがバラバラだと、保守性が下がります。
たとえば、ある画面ではyyyy/MM/dd、別の画面ではyyyy-MM-dd、CSVではMM/dd/yyyyのように混在すると、利用者も開発者も混乱します。
よく使う書式は、定数としてまとめておくと便利です。
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 LogDateTime = "yyyy-MM-dd HH:mm:ss.fff";
public const string FileTimestamp = "yyyyMMddHHmmss";
}
使う側は次のように書けます。
C#string text = DateTime.Now.ToString(DateTimeFormats.DateTime);
書式を一元管理しておくと、仕様変更にも対応しやすくなります。
8-6. ユーザー入力の日付文字列は必ず検証する
ユーザーが入力する日付文字列は、必ず検証しましょう。
ユーザーは、次のようなさまざまな値を入力する可能性があります。
2026/06/06
2026-06-06
20260606
令和8年6月6日
abc
空文字
2026/02/30
想定形式が決まっている場合は、TryParseExactで検証します。
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("正しい日付です");
}
else
{
Console.WriteLine("yyyy/MM/dd形式で入力してください");
}
複数形式を許可する場合でも、許可する形式を明示することが重要です。
C#string[] formats = { "yyyy/MM/dd", "yyyy-MM-dd", "yyyyMMdd" };
不正な日付をそのまま処理に進めると、例外やデータ不整合の原因になります。
9. C# DateTime String変換のよくある質問
9-1. DateTimeをyyyyMMdd形式のstringに変換するには?
ToString("yyyyMMdd")を使います。
C#DateTime date = new DateTime(2026, 6, 6);
string text = date.ToString("yyyyMMdd");
Console.WriteLine(text);
出力結果は次の通りです。
20260606
現在日付をyyyyMMdd形式にする場合は、次のようにします。
C#string today = DateTime.Now.ToString("yyyyMMdd");
ファイル名やIDに日時まで含めるなら、yyyyMMddHHmmssが便利です。
C#string timestamp = DateTime.Now.ToString("yyyyMMddHHmmss");
9-2. stringをDateTimeに変換できないときは?
まず、入力文字列が期待する形式になっているか確認します。
C#string text = "20260606";
形式が決まっている場合は、TryParseExactを使います。
C#using System.Globalization;
if (DateTime.TryParseExact(
text,
"yyyyMMdd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("変換できません");
}
Parseで失敗する場合でも、ParseExactやTryParseExactで書式を明示すれば変換できることがあります。
また、2026/02/30のような存在しない日付は、どのメソッドでも正しいDateTimeには変換できません。
9-3. ToStringで曜日を日本語表示するには?
曜日を表示するには、dddまたはddddを使います。日本語で表示したい場合は、CultureInfo("ja-JP")を指定します。
C#using System.Globalization;
DateTime date = new DateTime(2026, 6, 6);
string text = date.ToString("yyyy/MM/dd dddd", new CultureInfo("ja-JP"));
Console.WriteLine(text);
出力結果は次の通りです。
2026/06/06 土曜日
短い曜日にしたい場合は、dddを使います。
C#string text = date.ToString("yyyy/MM/dd ddd", new CultureInfo("ja-JP"));
出力例は次の通りです。
2026/06/06 土
9-4. DateTimeを日付だけ・時刻だけの文字列にするには?
日付だけを文字列にするには、yyyy/MM/ddを使います。
C#string dateText = DateTime.Now.ToString("yyyy/MM/dd");
時刻だけを文字列にするには、HH:mm:ssを使います。
C#string timeText = DateTime.Now.ToString("HH:mm:ss");
秒が不要なら、HH:mmにします。
C#string timeText = DateTime.Now.ToString("HH:mm");
日付と時刻を両方含める場合は、次のようにします。
C#string dateTimeText = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
9-5. DateTimeのミリ秒まで文字列にするには?
ミリ秒まで表示するには、fffを使います。
C#DateTime now = DateTime.Now;
string text = now.ToString("yyyy-MM-dd HH:mm:ss.fff");
Console.WriteLine(text);
出力例は次の通りです。
2026-06-06 14:30:15.123
ファイル名にミリ秒まで含める場合は、区切り文字を使わずに次のようにします。
C#string fileName = DateTime.Now.ToString("yyyyMMddHHmmssfff");
ログ出力では、ミリ秒まで含めると処理時間の確認がしやすくなります。
9-6. DateTime.NowとDateTime.UtcNowはどう使い分ける?
DateTime.Nowはローカル時刻、DateTime.UtcNowはUTC時刻です。
C#DateTime localNow = DateTime.Now;
DateTime utcNow = DateTime.UtcNow;
画面にユーザーの現地時刻を表示する場合は、DateTime.Nowが使われることがあります。
C#string text = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
一方、ログ、API、データ保存など、環境差を避けたい場合はDateTime.UtcNowを使うことが多いです。
C#string text = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ");
ただし、タイムゾーンやオフセットを明確に扱う必要がある場合は、DateTimeOffsetも検討しましょう。
C#string text = DateTimeOffset.UtcNow.ToString("o");
9-7. ParseとParseExactはどちらを使うべき?
入力形式が曖昧で、ある程度柔軟に解釈したい場合はParseまたはTryParseを使います。
C#DateTime date = DateTime.Parse("2026/06/06");
ただし、ユーザー入力など失敗する可能性がある場合は、TryParseの方が安全です。
C#if (DateTime.TryParse(input, out DateTime date))
{
Console.WriteLine(date);
}
入力形式が決まっている場合は、ParseExactまたはTryParseExactを使います。
C#DateTime date = DateTime.ParseExact(
"20260606",
"yyyyMMdd",
CultureInfo.InvariantCulture
);
実務では、外部入力にはTryParseExactを使うことが多いです。
C#if (DateTime.TryParseExact(
input,
"yyyyMMdd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("日付形式が正しくありません");
}
形式が決まっているならTryParseExact、形式が柔軟ならTryParseと覚えると分かりやすいです。
まとめ
C#でDateTimeをstringに変換する基本は、ToStringメソッドです。
C#string text = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
日付だけならyyyy/MM/dd、時刻だけならHH:mm:ss、ログならyyyy-MM-dd HH:mm:ss.fff、ファイル名ならyyyyMMddHHmmss、APIならISO 8601形式を使うとよいでしょう。
C#DateTime now = DateTime.Now;
string display = now.ToString("yyyy/MM/dd");
string log = now.ToString("yyyy-MM-dd HH:mm:ss.fff");
string file = now.ToString("yyyyMMddHHmmss");
string iso = now.ToString("o");
また、stringからDateTimeへ変換する場合は、Parse、TryParse、ParseExact、TryParseExactを使い分けます。
C#if (DateTime.TryParseExact(
input,
"yyyyMMdd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
Console.WriteLine(date);
}
特に重要なポイントは次の通りです。
| ポイント | 内容 |
|---|---|
ToStringで文字列化する | date.ToString("yyyy/MM/dd") |
月はMM、分はmm | 大文字と小文字に注意 |
24時間表記はHH | hhは12時間表記 |
固定形式にはCultureInfo.InvariantCulture | 環境差を避ける |
外部入力にはTryParse系 | 例外を防ぐ |
形式固定ならTryParseExact | 安全で明確 |
内部処理はDateTimeのまま | 文字列化は表示・出力時 |
タイムゾーンにはDateTimeOffsetも検討 | APIや国際対応で有効 |
DateTimeとstringの変換は、C#の実務開発で頻繁に登場します。表示用、ログ用、ファイル名用、API用など、用途に応じて適切な形式を選ぶことで、読みやすく、壊れにくい日時処理を実装できます。

