C#の日付変換を完全解説|文字列⇔DateTimeのParse・TryParse・ToString使い方

はじめに

C#で日付を扱うとき、避けて通れないのが「日付変換」です。画面の入力フォーム、CSVやExcelの取り込み、APIやJSONの受け渡し、データベース保存、ログ出力など、実務では文字列として受け取った日付をDateTimeに変換したり、逆にDateTimeを指定した形式の文字列に変換したりする場面が頻繁にあります。

C#では、文字列を日付に変換する方法としてDateTime.ParseDateTime.TryParseDateTime.ParseExactDateTime.TryParseExactなどが用意されています。また、日付を文字列に変換する場合はToStringを使います。

ただし、日付変換は一見シンプルに見えて、フォーマット、カルチャ、タイムゾーン、空文字、不正な日付などでエラーが起きやすい処理でもあります。

この記事では、C#の日付変換について、文字列からDateTimeへの変換、DateTimeから文字列への変換、フォーマット指定、CultureInfo、よくあるエラー、実務で使えるサンプルコードまでまとめて解説します。

1. C#の日付変換でできること

C#の日付変換では、主に次のような処理を行います。

C#
// 文字列をDateTimeに変換
DateTime date = DateTime.Parse("2026/06/16");

// DateTimeを文字列に変換
string text = date.ToString("yyyy/MM/dd");

日付はプログラム内部ではDateTimeなどの型で扱うのが基本です。一方で、画面入力やファイル、API通信では日付が文字列として渡されることが多いため、文字列と日付型を相互に変換する処理が必要になります。

1-1. 文字列⇔DateTime変換が必要になる場面

C#で日付変換が必要になる代表的な場面は次のとおりです。

入力フォームでユーザーが入力した"2026/06/16"DateTimeに変換する場合、CSVやExcelから読み込んだ"2026-06-16"を日付として扱う場合、APIから受け取った"2026-06-16T10:30:00"を変換する場合、データベースに保存するために日付を整形する場合、画面表示用にDateTime"2026年6月16日"のような文字列に変換する場合などです。

日付変換を正しく行わないと、変換エラーが発生したり、意図しない日付として解釈されたりすることがあります。特に01/02/2026のような文字列は、環境によって「1月2日」なのか「2月1日」なのか解釈が変わる可能性があるため注意が必要です。

1-2. Parse・TryParse・ToStringの違い

C#の日付変換でよく使うメソッドには、ParseTryParseToStringがあります。

Parseは、文字列をDateTimeに変換するメソッドです。変換できない文字列を渡すと例外が発生します。

C#
DateTime date = DateTime.Parse("2026/06/16");

TryParseも文字列をDateTimeに変換するメソッドですが、変換に失敗しても例外を発生させません。成功したかどうかをboolで返します。

C#
if (DateTime.TryParse("2026/06/16", out DateTime date))
{
Console.WriteLine(date);
}

ToStringは、DateTimeを文字列に変換するメソッドです。出力形式を指定できます。

C#
DateTime date = new DateTime(2026, 6, 16);
string text = date.ToString("yyyy/MM/dd");

基本的には、入力値のように失敗する可能性がある日付変換ではTryParseTryParseExactを使い、必ず正しい形式だと分かっている場合や、失敗時に例外として扱いたい場合はParseParseExactを使います。

1-3. 日付変換でよく使う型|DateTime・DateOnly・DateTimeOffset

C#で日付変換を行うときによく使う型には、DateTimeDateOnlyDateTimeOffsetがあります。

DateTimeは、日付と時刻を扱うもっとも一般的な型です。

C#
DateTime dateTime = new DateTime(2026, 6, 16, 10, 30, 0);

DateOnlyは、日付のみを扱う型です。誕生日、申込日、営業日など、時刻が不要なデータに向いています。

C#
DateOnly date = new DateOnly(2026, 6, 16);

DateTimeOffsetは、日付時刻に加えてUTCからの時差情報を持つ型です。タイムゾーンや世界中のユーザーが関係するシステムでは、DateTimeよりDateTimeOffsetの方が適している場合があります。

C#
DateTimeOffset dateTimeOffset = DateTimeOffset.Parse("2026-06-16T10:30:00+09:00");

単純な業務アプリではDateTimeで十分なことも多いですが、日付のみならDateOnly、タイムゾーンを考慮するならDateTimeOffsetを検討しましょう。

1-4. 本記事で扱う日付変換パターン

この記事では、次のようなC#の日付変換パターンを扱います。

文字列からDateTimeへの変換、フォーマットを指定した文字列からDateTimeへの変換、DateTimeから文字列への変換、日本語や英語などカルチャを考慮した変換、変換エラーの対処法、CSVやAPIなど実務で使える変換例です。

特に、DateTime.ParseDateTime.TryParseDateTime.ParseExactDateTime.TryParseExactDateTime.ToStringの違いを理解しておくと、C#の日付変換で迷う場面が大きく減ります。

2. C#で文字列をDateTimeに変換する基本

文字列をDateTimeに変換する基本的な方法は、DateTime.ParseまたはDateTime.TryParseを使うことです。

2-1. DateTime.Parseで文字列をDateTimeに変換する

DateTime.Parseは、文字列をDateTimeに変換します。

C#
string text = "2026/06/16";

DateTime date = DateTime.Parse(text);

Console.WriteLine(date);

実行すると、文字列"2026/06/16"DateTime型に変換されます。

Parseはシンプルに書けますが、変換できない文字列を渡すと例外が発生します。

C#
string text = "abc";

DateTime date = DateTime.Parse(text); // FormatException

そのため、ユーザー入力や外部ファイルのように値が不正である可能性がある場合は、後述するTryParseを使う方が安全です。

2-2. DateTime.TryParseで安全に変換する

DateTime.TryParseは、変換に成功したかどうかをboolで返します。変換に失敗しても例外は発生しません。

C#
string text = "2026/06/16";

if (DateTime.TryParse(text, out DateTime date))
{
Console.WriteLine($"変換成功: {date}");
}
else
{
Console.WriteLine("日付に変換できませんでした。");
}

TryParseは、ユーザー入力のチェックに向いています。

C#
string input = "2026/02/30";

if (!DateTime.TryParse(input, out DateTime date))
{
Console.WriteLine("正しい日付を入力してください。");
}

2026/02/30のような存在しない日付は変換できないため、TryParsefalseを返します。

2-3. ParseとTryParseの使い分け

ParseTryParseは、次のように使い分けるのが基本です。

Parseは、変換できることが前提のデータに使います。たとえば、プログラム内で固定された文字列や、すでにバリデーション済みの値を変換する場合です。

C#
DateTime date = DateTime.Parse("2026/06/16");

TryParseは、変換に失敗する可能性があるデータに使います。たとえば、画面入力、CSV、Excel、外部API、設定ファイルなどです。

C#
if (DateTime.TryParse(input, out DateTime date))
{
// 変換成功時の処理
}
else
{
// 変換失敗時の処理
}

実務では、例外処理に頼らず安全に判定できるTryParseを使う場面が多くなります。

2-4. 変換できる文字列形式の例

DateTime.ParseDateTime.TryParseでは、環境のカルチャ設定に応じてさまざまな形式の日付文字列を変換できます。

C#
DateTime.Parse("2026/06/16");
DateTime.Parse("2026-06-16");
DateTime.Parse("2026年6月16日");
DateTime.Parse("2026/06/16 10:30:00");

ただし、どの形式が変換できるかは実行環境やカルチャ設定に影響されることがあります。そのため、業務システムやAPI連携などで形式が決まっている場合は、ParseExactTryParseExactを使ってフォーマットを明示する方が安全です。

2-5. 変換できない文字列で発生するエラー

DateTime.Parseに不正な文字列を渡すと、FormatExceptionが発生します。

C#
string text = "日付ではない文字列";

DateTime date = DateTime.Parse(text);

この場合、次のようなエラーになります。

String was not recognized as a valid DateTime.

また、存在しない日付も変換できません。

C#
DateTime date = DateTime.Parse("2026/02/30");

2月30日は存在しないため、変換に失敗します。

ユーザー入力などでは、ParseではなくTryParseを使って、変換できるかどうかを事前に判定する実装にしましょう。

3. 日付フォーマットを指定して文字列をDateTimeに変換する

日付文字列の形式が決まっている場合は、DateTime.ParseExactまたはDateTime.TryParseExactを使います。

ParseTryParseは柔軟に解釈してくれますが、その分、環境によって結果が変わる可能性があります。ParseExactTryParseExactを使うと、「この形式の文字列だけを受け付ける」と明示できます。

3-1. DateTime.ParseExactの使い方

DateTime.ParseExactは、指定したフォーマットに完全一致する文字列をDateTimeに変換します。

C#
using System;
using System.Globalization;

string text = "2026/06/16";

DateTime date = DateTime.ParseExact(
text,
"yyyy/MM/dd",
CultureInfo.InvariantCulture
);

Console.WriteLine(date);

この例では、"yyyy/MM/dd"形式の文字列だけを変換できます。

C#
DateTime.ParseExact("2026/06/16", "yyyy/MM/dd", CultureInfo.InvariantCulture); // OK
DateTime.ParseExact("2026-06-16", "yyyy/MM/dd", CultureInfo.InvariantCulture); // NG

ParseExactはフォーマットに一致しない場合、例外を発生させます。

3-2. DateTime.TryParseExactの使い方

DateTime.TryParseExactは、指定したフォーマットで変換を試み、成功したかどうかをboolで返します。

C#
using System;
using System.Globalization;

string text = "2026/06/16";

bool success = DateTime.TryParseExact(
text,
"yyyy/MM/dd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date
);

if (success)
{
Console.WriteLine($"変換成功: {date}");
}
else
{
Console.WriteLine("指定された形式の日付ではありません。");
}

実務では、ユーザー入力やファイル取り込みのように変換失敗が想定される場合、TryParseExactを使うと安全です。

3-3. yyyy/MM/dd・yyyy-MM-dd・yyyyMMdd形式の変換例

よく使われる日付形式ごとの変換例を見てみましょう。

yyyy/MM/dd形式の場合です。

C#
DateTime date = DateTime.ParseExact(
"2026/06/16",
"yyyy/MM/dd",
CultureInfo.InvariantCulture
);

yyyy-MM-dd形式の場合です。

C#
DateTime date = DateTime.ParseExact(
"2026-06-16",
"yyyy-MM-dd",
CultureInfo.InvariantCulture
);

yyyyMMdd形式の場合です。

C#
DateTime date = DateTime.ParseExact(
"20260616",
"yyyyMMdd",
CultureInfo.InvariantCulture
);

ParseExactでは、区切り文字も含めてフォーマットが一致している必要があります。"yyyy/MM/dd"を指定した場合、"2026-06-16"は変換できません。

3-4. 時刻付き文字列をDateTimeに変換する方法

日付だけでなく時刻も含まれる文字列を変換する場合は、時刻部分もフォーマットに含めます。

C#
using System;
using System.Globalization;

string text = "2026/06/16 10:30:45";

DateTime dateTime = DateTime.ParseExact(
text,
"yyyy/MM/dd HH:mm:ss",
CultureInfo.InvariantCulture
);

Console.WriteLine(dateTime);

HHは24時間表記の時、mmは分、ssは秒を表します。

C#
string text = "2026-06-16T10:30:45";

DateTime dateTime = DateTime.ParseExact(
text,
"yyyy-MM-dd'T'HH:mm:ss",
CultureInfo.InvariantCulture
);

ISO 8601形式のようにTが含まれる場合は、'T'のようにリテラルとして指定します。

3-5. 複数フォーマットに対応する方法

CSVや外部データでは、複数の日付形式が混在していることがあります。その場合は、TryParseExactにフォーマットの配列を渡します。

C#
using System;
using System.Globalization;

string text = "2026-06-16";

string[] formats =
{
"yyyy/MM/dd",
"yyyy-MM-dd",
"yyyyMMdd",
"yyyy/MM/dd HH:mm:ss",
"yyyy-MM-dd HH:mm:ss"
};

bool success = DateTime.TryParseExact(
text,
formats,
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date
);

if (success)
{
Console.WriteLine($"変換成功: {date}");
}
else
{
Console.WriteLine("対応していない日付形式です。");
}

複数フォーマットに対応できると便利ですが、何でも許可しすぎると意図しない日付として解釈される可能性があります。業務要件に合わせて、受け付ける形式は明確に決めておきましょう。

4. DateTimeを文字列に変換するToStringの使い方

DateTimeを文字列に変換するには、ToStringを使います。

C#
DateTime date = new DateTime(2026, 6, 16);

string text = date.ToString();

Console.WriteLine(text);

ただし、引数なしのToStringは実行環境のカルチャ設定に依存します。出力形式を固定したい場合は、書式指定子を使いましょう。

4-1. DateTime.ToStringで日付を文字列に変換する

日付を指定した形式の文字列に変換する基本形は次のとおりです。

C#
DateTime date = new DateTime(2026, 6, 16);

string text = date.ToString("yyyy/MM/dd");

Console.WriteLine(text); // 2026/06/16

時刻も含める場合は、次のように指定します。

C#
DateTime dateTime = new DateTime(2026, 6, 16, 10, 30, 45);

string text = dateTime.ToString("yyyy/MM/dd HH:mm:ss");

Console.WriteLine(text); // 2026/06/16 10:30:45

ToStringでは、用途に合わせてさまざまな形式で日付を出力できます。

4-2. 標準の日付・時刻書式指定子

C#には、標準の日付・時刻書式指定子があります。

C#
DateTime dateTime = new DateTime(2026, 6, 16, 10, 30, 45);

Console.WriteLine(dateTime.ToString("d"));
Console.WriteLine(dateTime.ToString("D"));
Console.WriteLine(dateTime.ToString("t"));
Console.WriteLine(dateTime.ToString("T"));
Console.WriteLine(dateTime.ToString("f"));
Console.WriteLine(dateTime.ToString("F"));
Console.WriteLine(dateTime.ToString("s"));
Console.WriteLine(dateTime.ToString("o"));

代表的な指定子は次のとおりです。

dは短い日付形式、Dは長い日付形式、tは短い時刻形式、Tは長い時刻形式、fは長い日付と短い時刻、Fは長い日付と長い時刻、sは並べ替え可能な形式、oはラウンドトリップ形式です。

特にAPIやログなどで機械的に扱う日付には、"o"形式が使われることがあります。

C#
string text = dateTime.ToString("o");

ただし、画面表示では"yyyy/MM/dd""yyyy年M月d日"のようなカスタム書式を使うことが多いです。

4-3. カスタム書式指定子の使い方

カスタム書式指定子を使うと、日付の出力形式を自由に指定できます。

C#
DateTime dateTime = new DateTime(2026, 6, 16, 10, 30, 45);

Console.WriteLine(dateTime.ToString("yyyy/MM/dd"));
Console.WriteLine(dateTime.ToString("yyyy-MM-dd"));
Console.WriteLine(dateTime.ToString("yyyy年M月d日"));
Console.WriteLine(dateTime.ToString("HH:mm:ss"));
Console.WriteLine(dateTime.ToString("yyyy/MM/dd HH:mm:ss"));

よく使う指定子は次のとおりです。

yyyyは4桁の年、MMは2桁の月、Mは1桁または2桁の月、ddは2桁の日、dは1桁または2桁の日、HHは24時間表記の時、hhは12時間表記の時、mmは分、ssは秒、fffはミリ秒、dddは短い曜日、ddddは長い曜日を表します。

注意点として、月は大文字のM、分は小文字のmです。

C#
dateTime.ToString("yyyy/MM/dd HH:mm"); // 正しい

MMmmを間違えると、月と分が入れ替わったような意図しない表示になるため注意しましょう。

4-4. yyyy/MM/dd形式で出力する方法

DateTimeyyyy/MM/dd形式で出力するには、次のように書きます。

C#
DateTime date = new DateTime(2026, 6, 16);

string text = date.ToString("yyyy/MM/dd");

Console.WriteLine(text); // 2026/06/16

月や日をゼロ埋めしない場合は、Mdを使います。

C#
DateTime date = new DateTime(2026, 6, 5);

Console.WriteLine(date.ToString("yyyy/MM/dd")); // 2026/06/05
Console.WriteLine(date.ToString("yyyy/M/d")); // 2026/6/5

ファイル名や固定形式のデータとして使う場合は、yyyyMMdd形式もよく使われます。

C#
string fileDate = date.ToString("yyyyMMdd");

Console.WriteLine(fileDate); // 20260616

4-5. 時刻や曜日を含めて出力する方法

時刻を含めて出力する場合は、HH:mm:ssを追加します。

C#
DateTime dateTime = new DateTime(2026, 6, 16, 10, 30, 45);

string text = dateTime.ToString("yyyy/MM/dd HH:mm:ss");

Console.WriteLine(text); // 2026/06/16 10:30:45

曜日を含める場合は、dddまたはddddを使います。

C#
DateTime date = new DateTime(2026, 6, 16);

Console.WriteLine(date.ToString("yyyy/MM/dd ddd"));
Console.WriteLine(date.ToString("yyyy年M月d日 dddd"));

日本語の曜日で表示したい場合は、CultureInfoを指定します。

C#
using System.Globalization;

DateTime date = new DateTime(2026, 6, 16);
CultureInfo culture = new CultureInfo("ja-JP");

string text = date.ToString("yyyy年M月d日 dddd", culture);

Console.WriteLine(text);

このように、ToStringと書式指定子を使えば、画面表示、帳票、ログ、ファイル名などに合わせて日付を柔軟に文字列化できます。

5. CultureInfoを使った日付変換

C#の日付変換では、CultureInfoが重要です。CultureInfoは、国や地域ごとの日付形式、曜日名、月名、区切り文字などの文化設定を表します。

同じ文字列でも、カルチャによって日付の解釈が変わることがあります。そのため、実務ではCultureInfoを明示して、環境による変換結果の違いを防ぐことが大切です。

5-1. CultureInfoとは

CultureInfoは、System.Globalization名前空間にあるクラスです。

C#
using System.Globalization;

CultureInfo culture = new CultureInfo("ja-JP");

"ja-JP"は日本語、日本のカルチャを表します。"en-US"は英語、米国、"en-GB"は英語、英国です。

C#
CultureInfo ja = new CultureInfo("ja-JP");
CultureInfo us = new CultureInfo("en-US");
CultureInfo gb = new CultureInfo("en-GB");

日付変換でカルチャを指定すると、月名や曜日名、日付の並び順などをそのカルチャに合わせて処理できます。

5-2. 日本語の日付形式で変換する方法

日本語の日付文字列を変換する場合は、CultureInfo("ja-JP")を指定します。

C#
using System;
using System.Globalization;

string text = "2026年6月16日";

DateTime date = DateTime.Parse(
text,
new CultureInfo("ja-JP")
);

Console.WriteLine(date);

フォーマットを明示する場合は、ParseExactを使います。

C#
using System;
using System.Globalization;

string text = "2026年6月16日";

DateTime date = DateTime.ParseExact(
text,
"yyyy年M月d日",
new CultureInfo("ja-JP")
);

Console.WriteLine(date);

日本語の曜日を含む文字列を扱う場合も、ja-JPを指定すると扱いやすくなります。

C#
string text = "2026年6月16日 火曜日";

DateTime date = DateTime.ParseExact(
text,
"yyyy年M月d日 dddd",
new CultureInfo("ja-JP")
);

5-3. InvariantCultureを使うべき場面

CultureInfo.InvariantCultureは、特定の国や地域に依存しないカルチャです。システム間連携、ログ、CSV、固定フォーマットのデータ、APIとのやり取りなどでは、InvariantCultureを使うことがよくあります。

C#
using System.Globalization;

DateTime date = DateTime.ParseExact(
"2026-06-16",
"yyyy-MM-dd",
CultureInfo.InvariantCulture
);

InvariantCultureは、人間向けの自然な表示よりも、環境に依存しない安定した変換に向いています。

たとえば、CSVで常にyyyy-MM-dd形式を使うと決めている場合は、次のように書くと安全です。

C#
bool success = DateTime.TryParseExact(
input,
"yyyy-MM-dd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date
);

日本語画面に表示する場合はja-JP、システム内部や外部連携で固定形式を扱う場合はInvariantCulture、というように使い分けるとよいでしょう。

5-4. 英語表記の日付を変換する方法

英語の月名を含む日付を変換する場合は、英語のカルチャを指定します。

C#
using System;
using System.Globalization;

string text = "June 16, 2026";

DateTime date = DateTime.Parse(
text,
new CultureInfo("en-US")
);

Console.WriteLine(date);

ParseExactでフォーマットを指定することもできます。

C#
string text = "Jun 16, 2026";

DateTime date = DateTime.ParseExact(
text,
"MMM dd, yyyy",
new CultureInfo("en-US")
);

MMMMは完全な月名、MMMは短縮された月名を表します。

C#
DateTime.ParseExact("June 16, 2026", "MMMM dd, yyyy", new CultureInfo("en-US"));
DateTime.ParseExact("Jun 16, 2026", "MMM dd, yyyy", new CultureInfo("en-US"));

英語表記の日付を日本語カルチャで変換しようとすると失敗することがあります。月名や曜日名が含まれる場合は、必ず適切なCultureInfoを指定しましょう。

5-5. OSや実行環境による変換結果の違いを防ぐ方法

DateTime.Parseや引数なしのToStringは、現在のカルチャ設定に影響されます。そのため、開発環境では動いていたコードが、本番環境や別のOSでは異なる結果になることがあります。

環境差を防ぐには、次のようにフォーマットとカルチャを明示します。

C#
using System.Globalization;

string text = "2026-06-16";

DateTime date = DateTime.ParseExact(
text,
"yyyy-MM-dd",
CultureInfo.InvariantCulture
);

出力時も同様です。

C#
string output = date.ToString(
"yyyy-MM-dd",
CultureInfo.InvariantCulture
);

特に、CSV、JSON、ログ、データベース保存用の文字列など、機械的に処理する日付では、ParseExactTryParseExactInvariantCultureを組み合わせると安全です。

6. 日付変換でよくあるエラーと対処法

C#の日付変換では、フォーマット不一致、不正な日付、空文字、カルチャの違いなどが原因でエラーが発生します。ここでは、よくあるエラーと対処法を見ていきます。

6-1. String was not recognized as a valid DateTimeの原因

String was not recognized as a valid DateTime.は、文字列をDateTimeに変換できないときに発生する代表的なエラーです。

C#
DateTime date = DateTime.Parse("abc");

このエラーの主な原因は、日付として解釈できない文字列を渡している、フォーマットが一致していない、存在しない日付を指定している、カルチャが合っていない、空文字やnullを渡している、などです。

たとえば、次のような値は変換に失敗する可能性があります。

C#
DateTime.Parse("abc");
DateTime.Parse("2026/02/30");
DateTime.Parse("");

対処法としては、TryParseまたはTryParseExactを使って、変換できるかどうかを判定するのが基本です。

C#
if (!DateTime.TryParse(input, out DateTime date))
{
Console.WriteLine("日付形式が正しくありません。");
}

6-2. フォーマット不一致による変換失敗

ParseExactTryParseExactでは、指定したフォーマットと文字列が一致していないと変換に失敗します。

C#
DateTime date = DateTime.ParseExact(
"2026-06-16",
"yyyy/MM/dd",
CultureInfo.InvariantCulture
);

この例では、文字列はyyyy-MM-dd形式ですが、指定フォーマットはyyyy/MM/ddなので失敗します。

正しくは次のように書きます。

C#
DateTime date = DateTime.ParseExact(
"2026-06-16",
"yyyy-MM-dd",
CultureInfo.InvariantCulture
);

複数形式を受け付けたい場合は、フォーマット配列を使います。

C#
string[] formats = { "yyyy/MM/dd", "yyyy-MM-dd", "yyyyMMdd" };

bool success = DateTime.TryParseExact(
input,
formats,
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date
);

6-3. null・空文字・未入力の日付を扱う方法

ユーザー入力やCSVでは、日付が未入力の場合があります。nullや空文字をそのままParseすると、例外が発生します。

C#
string input = "";

DateTime date = DateTime.Parse(input); // エラー

未入力を許可する場合は、DateTime?を使うと便利です。DateTime?はnullを持てる日付型です。

C#
DateTime? date = null;

if (!string.IsNullOrWhiteSpace(input))
{
if (DateTime.TryParse(input, out DateTime parsedDate))
{
date = parsedDate;
}
}

メソッド化すると、次のように扱いやすくなります。

C#
static DateTime? ConvertToNullableDateTime(string? input)
{
if (string.IsNullOrWhiteSpace(input))
{
return null;
}

if (DateTime.TryParse(input, out DateTime date))
{
return date;
}

return null;
}

未入力と不正な入力を区別したい場合は、戻り値だけでなくエラーメッセージを返す設計にするとよいでしょう。

6-4. 例外を出さずに変換する実装例

例外を出さずに日付変換するには、TryParseExactを使うのが安全です。

C#
using System;
using System.Globalization;

static bool TryConvertDate(string? input, out DateTime date)
{
date = default;

if (string.IsNullOrWhiteSpace(input))
{
return false;
}

string[] formats =
{
"yyyy/MM/dd",
"yyyy-MM-dd",
"yyyyMMdd"
};

return DateTime.TryParseExact(
input,
formats,
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out date
);
}

使用例は次のとおりです。

C#
string input = "2026-06-16";

if (TryConvertDate(input, out DateTime date))
{
Console.WriteLine($"変換成功: {date:yyyy/MM/dd}");
}
else
{
Console.WriteLine("日付に変換できませんでした。");
}

このようにしておくと、変換失敗時にプログラムが停止せず、画面にエラーメッセージを表示したり、該当行をスキップしたりできます。

6-5. 日付として不正な値を判定する方法

日付として不正な値を判定するには、TryParseまたはTryParseExactを使います。

C#
bool isValid = DateTime.TryParse("2026/02/30", out DateTime date);

Console.WriteLine(isValid); // false

フォーマットも含めて厳密に判定したい場合は、TryParseExactを使います。

C#
bool isValid = DateTime.TryParseExact(
"2026/06/16",
"yyyy/MM/dd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date
);

たとえば、yyyy/MM/dd形式だけを許可したい場合、2026-06-16は不正として扱えます。

C#
DateTime.TryParseExact(
"2026-06-16",
"yyyy/MM/dd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date
); // false

「日付として有効か」と「指定フォーマットとして有効か」は別の判定です。入力ルールを厳密にしたい場合は、TryParseExactを使いましょう。

7. 実務で使えるC#日付変換のサンプルコード

ここからは、実務でよくある日付変換のサンプルコードを紹介します。

7-1. 入力フォームの日付文字列をDateTimeに変換する

入力フォームでは、ユーザーが日付を未入力にしたり、誤った形式で入力したりする可能性があります。そのため、TryParseExactでチェックするのがおすすめです。

C#
using System;
using System.Globalization;

string input = "2026/06/16";

if (DateTime.TryParseExact(
input,
"yyyy/MM/dd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
Console.WriteLine($"登録する日付: {date}");
}
else
{
Console.WriteLine("日付はyyyy/MM/dd形式で入力してください。");
}

未入力を許可する場合は、DateTime?を使います。

C#
DateTime? birthday = null;

if (!string.IsNullOrWhiteSpace(input))
{
if (DateTime.TryParseExact(
input,
"yyyy/MM/dd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime parsedDate))
{
birthday = parsedDate;
}
else
{
Console.WriteLine("日付形式が正しくありません。");
}
}

入力フォームでは、許可する日付形式を明確にして、エラーメッセージもその形式に合わせることが大切です。

7-2. CSVやExcelの日付文字列を変換する

CSVやExcelでは、日付形式が複数混在することがあります。たとえば、2026/06/162026-06-1620260616のような形式です。

C#
using System;
using System.Globalization;

string csvValue = "2026-06-16";

string[] formats =
{
"yyyy/MM/dd",
"yyyy-MM-dd",
"yyyyMMdd"
};

if (DateTime.TryParseExact(
csvValue,
formats,
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
Console.WriteLine($"変換成功: {date:yyyy/MM/dd}");
}
else
{
Console.WriteLine($"日付変換エラー: {csvValue}");
}

CSV取り込みでは、変換できない行をログに残す実装もよく使われます。

C#
foreach (string value in csvDateValues)
{
if (DateTime.TryParseExact(
value,
formats,
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
Console.WriteLine($"OK: {date:yyyy-MM-dd}");
}
else
{
Console.WriteLine($"NG: {value}");
}
}

Excelから読み込む場合、ライブラリによっては日付が文字列ではなく数値やDateTimeとして取得されることもあります。取得した値の型を確認してから変換するようにしましょう。

7-3. APIやJSONの日付文字列を変換する

APIやJSONでは、ISO 8601形式の日付文字列がよく使われます。

JSON
{
"createdAt": "2026-06-16T10:30:45+09:00"
}

このようにタイムゾーン情報が含まれる場合は、DateTimeOffsetを使うと安全です。

C#
string text = "2026-06-16T10:30:45+09:00";

DateTimeOffset dateTimeOffset = DateTimeOffset.Parse(text);

Console.WriteLine(dateTimeOffset);

DateTimeに変換したい場合は、次のようにできます。

C#
DateTime dateTime = dateTimeOffset.DateTime;

UTCとして扱いたい場合は、UtcDateTimeを使います。

C#
DateTime utcDateTime = dateTimeOffset.UtcDateTime;

API連携では、タイムゾーン情報を失うと時刻がずれる原因になります。+09:00Zが含まれる日付時刻は、DateTimeOffsetで受けることを検討しましょう。

7-4. データベース保存用に日付を整形する

データベースに日付を保存する場合、基本的には文字列ではなく、DateTime型のパラメータとして渡すのが安全です。

C#
DateTime date = new DateTime(2026, 6, 16);

// SQLに文字列連結するのではなく、パラメータで渡す
// command.Parameters.Add("@Date", SqlDbType.DateTime).Value = date;

文字列としてSQLを組み立てると、フォーマットの違いやSQLインジェクションのリスクがあります。保存時は可能な限り、パラメータ化クエリを使いましょう。

どうしても文字列として整形する必要がある場合は、環境に依存しにくい形式にします。

C#
string dbText = date.ToString(
"yyyy-MM-dd HH:mm:ss",
CultureInfo.InvariantCulture
);

ただし、これはあくまで文字列化が必要な場合の方法です。データベースには、日付型として保存するのが基本です。

7-5. 画面表示用にDateTimeを文字列化する

画面表示用の日付は、ユーザーが読みやすい形式に変換します。

C#
DateTime date = new DateTime(2026, 6, 16);

string displayText = date.ToString("yyyy年M月d日");

Console.WriteLine(displayText); // 2026年6月16日

曜日を含める場合は、CultureInfo("ja-JP")を指定します。

C#
using System.Globalization;

DateTime date = new DateTime(2026, 6, 16);

string displayText = date.ToString(
"yyyy年M月d日(dddd)",
new CultureInfo("ja-JP")
);

Console.WriteLine(displayText);

一覧画面では短めの形式、詳細画面では曜日や時刻を含めるなど、用途によって出し分けると見やすくなります。

C#
DateTime dateTime = new DateTime(2026, 6, 16, 10, 30, 0);

string listText = dateTime.ToString("yyyy/MM/dd");
string detailText = dateTime.ToString("yyyy年M月d日 HH:mm");

Console.WriteLine(listText);
Console.WriteLine(detailText);

8. DateTime変換で押さえるべき注意点

C#の日付変換では、単に文字列とDateTimeを変換できればよいというわけではありません。日付と時刻の区別、タイムゾーン、DateTimeKindDateTimeOffsetDateOnlyなども意識する必要があります。

8-1. 日付と時刻の扱いを分ける

誕生日、入会日、請求日、営業日など、時刻が不要なデータをDateTimeで扱うと、00:00:00という時刻が付いてきます。

C#
DateTime date = new DateTime(2026, 6, 16);

Console.WriteLine(date); // 2026/06/16 0:00:00

時刻が不要な場合は、表示時に日付だけを出力します。

C#
string text = date.ToString("yyyy/MM/dd");

また、日付のみを明確に扱いたい場合は、DateOnlyを使う選択肢もあります。

C#
DateOnly dateOnly = new DateOnly(2026, 6, 16);

日付だけが必要なのか、時刻まで必要なのかを最初に整理しておくと、後から時刻の扱いで混乱しにくくなります。

8-2. タイムゾーンを考慮する

日本国内だけで完結するシステムでは意識しないこともありますが、API連携や海外ユーザーが関係するシステムではタイムゾーンが重要です。

たとえば、次の文字列は日本時間の2026年6月16日10時30分を表します。

C#
string text = "2026-06-16T10:30:00+09:00";

このようにUTCからのオフセットが含まれる場合は、DateTimeOffsetで扱うと安全です。

C#
DateTimeOffset dto = DateTimeOffset.Parse("2026-06-16T10:30:00+09:00");

Console.WriteLine(dto);
Console.WriteLine(dto.UtcDateTime);

時刻をUTCで保存し、画面表示時にユーザーのタイムゾーンへ変換する設計にすると、グローバルなシステムでも扱いやすくなります。

8-3. DateTimeKindの違い

DateTimeには、Kindというプロパティがあります。これは、その日時がローカル時刻なのか、UTCなのか、未指定なのかを表します。

C#
DateTime local = DateTime.Now;
DateTime utc = DateTime.UtcNow;
DateTime unspecified = new DateTime(2026, 6, 16);

Console.WriteLine(local.Kind); // Local
Console.WriteLine(utc.Kind); // Utc
Console.WriteLine(unspecified.Kind); // Unspecified

DateTimeKindには、主に次の3種類があります。

Localはローカル時刻、Utcは協定世界時、Unspecifiedはどちらとも指定されていない日時です。

Kindを意識せずにUTC変換やローカル変換を行うと、時刻がずれることがあります。

C#
DateTime utcNow = DateTime.UtcNow;
DateTime localTime = utcNow.ToLocalTime();

日付時刻を外部システムとやり取りする場合は、その値がUTCなのかローカル時刻なのかを明確にしておきましょう。

8-4. DateTimeOffsetを使うべきケース

DateTimeOffsetは、日時とUTCからのオフセットをセットで扱える型です。次のようなケースでは、DateTimeOffsetの使用を検討しましょう。

APIで2026-06-16T10:30:00+09:00のような値を扱う場合、海外ユーザーの操作日時を保存する場合、ログや監査証跡で正確な時刻を残したい場合、UTCとローカル時刻を明確に変換したい場合です。

C#
DateTimeOffset now = DateTimeOffset.Now;

Console.WriteLine(now);
Console.WriteLine(now.Offset);
Console.WriteLine(now.UtcDateTime);

文字列への変換もできます。

C#
string text = now.ToString("o");

Console.WriteLine(text);

DateTimeだけではタイムゾーン情報が不足することがあります。時差を含めて正確に扱いたい場合は、DateTimeOffsetを使うとよいでしょう。

8-5. DateOnly・TimeOnlyを使うべきケース

DateOnlyは日付のみ、TimeOnlyは時刻のみを扱う型です。

C#
DateOnly date = new DateOnly(2026, 6, 16);
TimeOnly time = new TimeOnly(10, 30, 0);

DateOnlyは、誕生日、営業日、締切日、申込日、祝日など、時刻が不要なデータに向いています。

C#
DateOnly birthday = DateOnly.Parse("1990/04/01");

フォーマットを指定して変換することもできます。

C#
DateOnly dateOnly = DateOnly.ParseExact(
"2026-06-16",
"yyyy-MM-dd",
CultureInfo.InvariantCulture
);

TimeOnlyは、開始時刻、終了時刻、営業時間など、日付が不要な時刻データに向いています。

C#
TimeOnly startTime = TimeOnly.Parse("09:30");

日付だけ、または時刻だけで十分なデータにDateTimeを使うと、不要な情報を持つことになります。要件に合わせて、DateTimeDateOnlyTimeOnlyDateTimeOffsetを使い分けましょう。

まとめ

C#の日付変換では、文字列をDateTimeに変換する場合はDateTime.ParseDateTime.TryParseを使い、日付を文字列に変換する場合はDateTime.ToStringを使います。

ただし、実務では日付フォーマットが決まっていることが多いため、ParseExactTryParseExactでフォーマットを明示するのが安全です。特に、ユーザー入力、CSV、Excel、API、JSONなど外部から受け取る値は、変換に失敗する可能性があるため、例外を発生させないTryParseTryParseExactを使うとよいでしょう。

日付変換で重要なのは、フォーマットとカルチャを明示することです。CultureInfo.InvariantCultureを使えば、OSや実行環境による違いを避けやすくなります。日本語の日付や曜日を扱う場合はCultureInfo("ja-JP")、英語の月名を扱う場合はCultureInfo("en-US")など、用途に応じて指定しましょう。

また、日付と時刻を扱う場合は、DateTimeKindやタイムゾーンにも注意が必要です。時差を含む日時を扱うならDateTimeOffset、日付だけならDateOnly、時刻だけならTimeOnlyを使うことで、より意図が明確なコードになります。

C#の日付変換は、ParseTryParseParseExactTryParseExactToStringの役割を理解すれば、ほとんどのケースに対応できます。変換元の形式、変換失敗時の扱い、表示形式、タイムゾーンの要否を整理しながら、用途に合った方法を選びましょう。