C#で日付をyyyyMMdd形式に変換・文字列からDateTimeへ変換する方法

はじめに

C#で日付を扱うとき、実務でよく使われる形式のひとつがyyyyMMddです。たとえば、2026年6月19日であれば20260619のように、年・月・日を8桁の文字列で表します。

yyyyMMdd形式は、CSV出力、API連携、ファイル名、ログ、データベース連携などでよく使われます。ただし、C#では日付そのものはDateTime型やDateTimeOffset型で扱い、yyyyMMddはあくまで表示・保存・連携用の文字列として扱うのが基本です。

この記事では、C#でDateTimeyyyyMMdd形式の文字列に変換する方法、反対にyyyyMMdd形式の文字列をDateTimeへ変換する方法、よくあるエラーや実務で使えるコード例まで解説します。

1. C#で日付をyyyyMMdd形式に扱う基本

1-1. yyyyMMddとは何か

yyyyMMddとは、日付を次のように8桁で表す形式です。

C#
20260619

内訳は次のとおりです。

yyyy : 4桁の西暦
MM : 2桁の月
dd : 2桁の日

たとえば、2026年1月5日であれば次のようになります。

20260105

月や日が1桁の場合でも、0105のようにゼロ埋めされる点が特徴です。

C#では、DateTime型の日付をToString("yyyyMMdd")で変換すると、この形式の文字列を取得できます。

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

string text = date.ToString("yyyyMMdd");

Console.WriteLine(text); // 20260105

1-2. yyyyMMddとyyyy-MM-ddの違い

yyyyMMddyyyy-MM-ddは、どちらも日付を表す形式ですが、見た目と用途が異なります。

yyyyMMdd   : 20260619
yyyy-MM-dd : 2026-06-19

yyyy-MM-ddはハイフンが入っているため、人が見たときに読みやすい形式です。一方、yyyyMMddは区切り文字がないため、ファイル名やコード値、CSVの項目などで扱いやすい形式です。

C#では、どちらもToStringの書式指定で簡単に変換できます。

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

Console.WriteLine(date.ToString("yyyyMMdd")); // 20260619
Console.WriteLine(date.ToString("yyyy-MM-dd")); // 2026-06-19

見た目は似ていますが、外部システムとの連携ではフォーマットが完全一致している必要があります。yyyyMMddを求められている場面でyyyy-MM-ddを渡すと、エラーになることがあります。

1-3. C#で日付フォーマットを指定する基本構文

C#で日付を文字列に変換する場合は、DateTime.ToStringにフォーマット文字列を指定します。

C#
DateTime date = DateTime.Now;

string result = date.ToString("yyyyMMdd");

よく使う日付フォーマットには、次のようなものがあります。

C#
DateTime date = new DateTime(2026, 6, 19, 15, 30, 45);

Console.WriteLine(date.ToString("yyyyMMdd")); // 20260619
Console.WriteLine(date.ToString("yyyy-MM-dd")); // 2026-06-19
Console.WriteLine(date.ToString("yyyy/MM/dd")); // 2026/06/19
Console.WriteLine(date.ToString("yyyyMMddHHmmss")); // 20260619153045

ここで重要なのは、MMmmを間違えないことです。

MM : 月
mm : 分

yyyyMMddでは月を表すために大文字のMMを使います。

1-4. yyyyMMdd形式が使われる主な場面

yyyyMMdd形式は、次のような場面でよく使われます。

・CSVや固定長ファイルの日付項目
・API連携時の日付パラメータ
・帳票やバッチ処理の日付キー
・ログファイル名
・バックアップファイル名
・データベースの文字列項目
・外部システムとの連携データ

たとえば、日付付きのファイル名を作成する場合は次のように書けます。

C#
string fileName = $"sales_{DateTime.Today:yyyyMMdd}.csv";

Console.WriteLine(fileName); // sales_20260619.csv

yyyyMMdd形式は、数字だけで構成されるため並び替えにも強いです。文字列として昇順ソートしても、日付順に並びやすいというメリットがあります。

20260617
20260618
20260619

ただし、日付の計算や比較を行う場合は、文字列のまま処理するのではなく、DateTime型に変換してから扱うのが基本です。

2. DateTimeをyyyyMMdd形式の文字列に変換する方法

2-1. DateTime.ToString("yyyyMMdd")の基本

DateTimeyyyyMMdd形式の文字列に変換する基本は、ToString("yyyyMMdd")です。

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

string yyyymmdd = date.ToString("yyyyMMdd");

Console.WriteLine(yyyymmdd); // 20260619

ToString("yyyyMMdd")を使うと、年は4桁、月と日は2桁で出力されます。月や日が1桁の場合も自動的にゼロ埋めされます。

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

string yyyymmdd = date.ToString("yyyyMMdd");

Console.WriteLine(yyyymmdd); // 20260105

yyyyMMdd形式にするために、自分で文字列連結する必要はありません。

C#
// 非推奨ではないが、冗長でミスが起きやすい
string text = date.Year.ToString()
+ date.Month.ToString("00")
+ date.Day.ToString("00");

通常は次のように書くのが簡潔です。

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

2-2. 現在日付をyyyyMMdd形式に変換する

現在日時をyyyyMMdd形式に変換する場合は、DateTime.Nowを使います。

C#
string today = DateTime.Now.ToString("yyyyMMdd");

Console.WriteLine(today);

ただし、日付だけが必要な場合はDateTime.Todayを使うこともできます。

C#
string today = DateTime.Today.ToString("yyyyMMdd");

Console.WriteLine(today);

DateTime.Nowには現在時刻も含まれますが、yyyyMMdd形式に変換する場合、時刻部分は出力されません。

C#
DateTime now = DateTime.Now;

Console.WriteLine(now); // 2026/06/19 15:30:45 など
Console.WriteLine(now.ToString("yyyyMMdd")); // 20260619

2-3. 任意の日付をyyyyMMdd形式に変換する

任意の日付をyyyyMMdd形式に変換する場合は、DateTimeのインスタンスを作成してからToStringを使います。

C#
DateTime date = new DateTime(2026, 12, 31);

string result = date.ToString("yyyyMMdd");

Console.WriteLine(result); // 20261231

文字列から作成した日付をyyyyMMddに変換することもできます。

C#
DateTime date = DateTime.Parse("2026/12/31");

string result = date.ToString("yyyyMMdd");

Console.WriteLine(result); // 20261231

ただし、入力文字列の形式が決まっている場合は、DateTime.ParseよりもDateTime.ParseExactDateTime.TryParseExactを使う方が安全です。

2-4. DateTime.NowとDateTime.Todayの使い分け

DateTime.NowDateTime.Todayは、どちらも現在日付を扱うときに使えますが、意味が異なります。

C#
DateTime now = DateTime.Now;
DateTime today = DateTime.Today;

Console.WriteLine(now); // 現在の日付と時刻
Console.WriteLine(today); // 今日の日付 00:00:00

DateTime.Nowは現在日時を取得します。

C#
DateTime now = DateTime.Now;
// 例: 2026/06/19 15:30:45

DateTime.Todayは今日の日付を取得し、時刻は00:00:00になります。

C#
DateTime today = DateTime.Today;
// 例: 2026/06/19 00:00:00

yyyyMMdd形式に変換するだけであれば、どちらを使っても結果は同じです。

C#
Console.WriteLine(DateTime.Now.ToString("yyyyMMdd"));
Console.WriteLine(DateTime.Today.ToString("yyyyMMdd"));

ただし、日付だけを扱う意図を明確にしたい場合は、DateTime.Todayを使うと読みやすくなります。

C#
string targetDate = DateTime.Today.ToString("yyyyMMdd");

一方、日時を取得したうえで、ログや処理時刻も扱う場合はDateTime.Nowが適しています。

2-5. CultureInfoを指定して安全に変換する方法

yyyyMMddのように数字だけの固定形式では、通常の日本語環境で大きな問題になることは少ないです。ただし、実務では環境による影響を避けるためにCultureInfo.InvariantCultureを指定することがあります。

C#
using System;
using System.Globalization;

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

string result = date.ToString("yyyyMMdd", CultureInfo.InvariantCulture);

Console.WriteLine(result); // 20260619

CultureInfo.InvariantCultureは、特定の言語や地域に依存しないカルチャです。API連携やファイル出力など、常に同じ形式で出力したい場合に使うと安全です。

C#
public static string ToYyyyMMdd(DateTime date)
{
return date.ToString("yyyyMMdd", CultureInfo.InvariantCulture);
}

特に、サーバー環境、バッチ処理、クラウド環境などでは、実行環境のカルチャ設定が開発環境と異なる場合があります。そのため、固定フォーマットで日付を文字列化する処理では、CultureInfo.InvariantCultureを指定しておくと安心です。

3. yyyyMMdd形式の文字列をDateTimeに変換する方法

3-1. DateTime.ParseExactで変換する基本

yyyyMMdd形式の文字列をDateTimeに変換するには、DateTime.ParseExactを使います。

C#
using System;
using System.Globalization;

string text = "20260619";

DateTime date = DateTime.ParseExact(
text,
"yyyyMMdd",
CultureInfo.InvariantCulture
);

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

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

C#
string text = "2026-06-19";

DateTime date = DateTime.ParseExact(
text,
"yyyyMMdd",
CultureInfo.InvariantCulture
);

上記のように、入力がyyyy-MM-ddなのにフォーマットとしてyyyyMMddを指定すると、FormatExceptionが発生します。

yyyyMMdd形式を厳密に受け取りたい場合は、ParseExactが適しています。

3-2. DateTime.TryParseExactで安全に変換する方法

ユーザー入力や外部ファイル、APIから受け取った文字列を変換する場合は、TryParseExactを使うのがおすすめです。

C#
using System;
using System.Globalization;

string text = "20260619";

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

if (success)
{
Console.WriteLine($"変換成功: {date}");
}
else
{
Console.WriteLine("変換失敗");
}

TryParseExactは、変換に失敗しても例外を投げません。戻り値としてtrueまたはfalseを返します。

C#
string text = "20260230";

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

Console.WriteLine(success); // False

20260230のように存在しない日付の場合も、TryParseExactなら安全に判定できます。

3-3. yyyyMMdd形式以外の文字列が来た場合のエラー対策

yyyyMMdd形式以外の文字列が来る可能性がある場合、ParseExactをそのまま使うと例外が発生します。

C#
string text = "2026-06-19";

DateTime date = DateTime.ParseExact(
text,
"yyyyMMdd",
CultureInfo.InvariantCulture
);

このコードでは、入力文字列がyyyyMMddではないためFormatExceptionが発生します。

安全に処理するには、TryParseExactを使います。

C#
string text = "2026-06-19";

if (DateTime.TryParseExact(
text,
"yyyyMMdd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("yyyyMMdd形式ではありません。");
}

外部から受け取るデータは、想定外の形式になっている可能性があります。そのため、実務ではTryParseExactで検証してから処理することが多いです。

3-4. null・空文字・不正な日付への対応

yyyyMMdd形式の文字列を変換する場合は、nullや空文字への対応も必要です。

C#
using System;
using System.Globalization;

string? text = null;

if (!string.IsNullOrWhiteSpace(text) &&
DateTime.TryParseExact(
text,
"yyyyMMdd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
Console.WriteLine($"変換成功: {date}");
}
else
{
Console.WriteLine("日付文字列が不正です。");
}

string.IsNullOrWhiteSpaceを使うと、次のような値をまとめてチェックできます。

null
""
" "

不正な日付もTryParseExactで判定できます。

C#
string text = "20240230";

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

Console.WriteLine(success); // False

2024年2月はうるう年ですが、2月30日は存在しないため変換に失敗します。

3-5. ParseExactとTryParseExactの違い

ParseExactTryParseExactの大きな違いは、変換に失敗したときの動作です。

ParseExact    : 失敗すると例外を投げる
TryParseExact : 失敗するとfalseを返す

ParseExactの例です。

C#
string text = "2026-06-19";

DateTime date = DateTime.ParseExact(
text,
"yyyyMMdd",
CultureInfo.InvariantCulture
);

この場合、文字列がyyyyMMdd形式ではないため、例外が発生します。

一方、TryParseExactでは例外を投げずに判定できます。

C#
string text = "2026-06-19";

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

if (!success)
{
Console.WriteLine("変換できませんでした。");
}

入力値が必ず正しいと分かっている場合はParseExactでも問題ありません。しかし、ユーザー入力、CSV、API、外部システム連携などでは、不正な値が来る可能性があるため、TryParseExactを使う方が安全です。

4. yyyyMMdd形式の変換でよくあるエラーと原因

4-1. FormatExceptionが発生するケース

FormatExceptionは、文字列が指定した日付フォーマットに一致しない場合に発生します。

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

DateTime date = DateTime.ParseExact(
text,
"yyyyMMdd",
CultureInfo.InvariantCulture
);

このコードでは、入力文字列にスラッシュが含まれているため、yyyyMMdd形式とは一致しません。

次のようなケースでもFormatExceptionが発生します。

2026-06-19
2026/06/19
2026061
202606190
abc
空文字

安全に処理したい場合は、TryParseExactを使います。

C#
bool success = DateTime.TryParseExact(
text,
"yyyyMMdd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date
);

変換前に8桁の数字かどうかを確認する方法もあります。

C#
bool isEightDigits = text.Length == 8 && text.All(char.IsDigit);

ただし、8桁の数字であっても、20240230のように存在しない日付は変換できません。最終的な日付チェックはTryParseExactで行うのが確実です。

4-2. yyyyとYYYYの違いに注意する

C#の日付フォーマットでは、年を表す場合は小文字のyyyyを使います。

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

Console.WriteLine(date.ToString("yyyyMMdd")); // 20260619

YYYYと大文字で書かないように注意してください。

C#
Console.WriteLine(date.ToString("YYYYMMdd"));

C#のカスタム日付書式では、年を4桁で表す指定はyyyyです。Javaなど他の言語ではYYYYが使われる場面もありますが、C#では基本的にyyyyを使うと覚えておきましょう。

特に、他言語のサンプルコードをC#に移植するときは注意が必要です。

C#
// C#ではこちらを使う
string text = date.ToString("yyyyMMdd");

4-3. MMとmmの違いに注意する

yyyyMMdd形式で特に多いミスが、MMmmの間違いです。

MM : 月
mm : 分

正しい書き方は次のとおりです。

C#
DateTime date = new DateTime(2026, 6, 19, 15, 30, 0);

Console.WriteLine(date.ToString("yyyyMMdd")); // 20260619

誤ってmmを使うと、月ではなく分が出力されます。

C#
DateTime date = new DateTime(2026, 6, 19, 15, 30, 0);

Console.WriteLine(date.ToString("yyyymmdd")); // 20263019

この例では、月の06ではなく、分の30が出力されています。

yyyyMMdd形式では、月は必ず大文字のMMです。

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

4-4. 20240230のような存在しない日付への対応

20240230のように8桁の数字であっても、存在しない日付はDateTimeに変換できません。

C#
string text = "20240230";

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

Console.WriteLine(success); // False

文字数や数字チェックだけでは、正しい日付かどうかは判定できません。

C#
string text = "20240230";

bool isEightDigits = text.Length == 8 && text.All(char.IsDigit);

Console.WriteLine(isEightDigits); // True

このように、8桁の数字であることと、実在する日付であることは別です。

実務では次のように、最終的にTryParseExactで日付として妥当かどうかを確認します。

C#
public static bool IsValidYyyyMMdd(string text)
{
return DateTime.TryParseExact(
text,
"yyyyMMdd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out _
);
}

4-5. ゼロ埋めされていない日付の扱い

yyyyMMdd形式では、月と日は必ず2桁です。

正しい例: 20260105
誤った例: 202615

たとえば、2026年1月5日を202615のように表すと、yyyyMMdd形式としては不正です。

C#
string text = "202615";

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

Console.WriteLine(success); // False

ゼロ埋めされた形式で出力したい場合は、ToString("yyyyMMdd")を使えば自動で対応できます。

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

string result = date.ToString("yyyyMMdd");

Console.WriteLine(result); // 20260105

もし入力として2026/1/5のような文字列を受け取る場合は、いったん別のフォーマットで解析してからyyyyMMddに変換します。

C#
string input = "2026/1/5";

DateTime date = DateTime.ParseExact(
input,
"yyyy/M/d",
CultureInfo.InvariantCulture
);

string result = date.ToString("yyyyMMdd");

Console.WriteLine(result); // 20260105

5. 実務で使えるyyyyMMdd変換コード例

5-1. DateTimeからyyyyMMdd文字列へ変換するサンプル

DateTimeからyyyyMMdd形式の文字列へ変換する基本サンプルです。

C#
using System;
using System.Globalization;

public class Program
{
public static void Main()
{
DateTime date = new DateTime(2026, 6, 19);

string result = date.ToString("yyyyMMdd", CultureInfo.InvariantCulture);

Console.WriteLine(result); // 20260619
}
}

現在日付を使う場合は次のように書けます。

C#
using System;
using System.Globalization;

string today = DateTime.Today.ToString("yyyyMMdd", CultureInfo.InvariantCulture);

Console.WriteLine(today);

ファイル名に使う場合の例です。

C#
string fileName = $"report_{DateTime.Today:yyyyMMdd}.csv";

Console.WriteLine(fileName);

ただし、カルチャを明示したい場合は次のように書くとより安全です。

C#
string fileName = $"report_{DateTime.Today.ToString("yyyyMMdd", CultureInfo.InvariantCulture)}.csv";

5-2. yyyyMMdd文字列からDateTimeへ変換するサンプル

yyyyMMdd形式の文字列からDateTimeへ変換するサンプルです。

C#
using System;
using System.Globalization;

public class Program
{
public static void Main()
{
string text = "20260619";

DateTime date = DateTime.ParseExact(
text,
"yyyyMMdd",
CultureInfo.InvariantCulture
);

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

入力値が不正な可能性がある場合は、TryParseExactを使います。

C#
using System;
using System.Globalization;

string text = "20260619";

if (DateTime.TryParseExact(
text,
"yyyyMMdd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
Console.WriteLine($"変換成功: {date:yyyy-MM-dd}");
}
else
{
Console.WriteLine("変換失敗");
}

TryParseExactを使うことで、例外処理に頼らずに変換の成否を判定できます。

5-3. 変換に失敗した場合の分岐処理

実務では、変換に失敗した場合にエラーメッセージを返したり、処理を中断したりする必要があります。

C#
using System;
using System.Globalization;

string input = "20260230";

if (!DateTime.TryParseExact(
input,
"yyyyMMdd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
Console.WriteLine("日付が不正です。yyyyMMdd形式で入力してください。");
return;
}

Console.WriteLine($"処理対象日: {date:yyyy-MM-dd}");

メソッドの戻り値として結果を返す場合は、次のように書けます。

C#
public static bool TryConvertToDateTime(string input, out DateTime date)
{
return DateTime.TryParseExact(
input,
"yyyyMMdd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out date
);
}

呼び出し側です。

C#
if (TryConvertToDateTime("20260619", out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("変換できませんでした。");
}

5-4. メソッド化して再利用する書き方

yyyyMMdd形式の変換を複数箇所で使う場合は、メソッド化しておくと便利です。

C#
using System;
using System.Globalization;

public static class DateTimeExtensions
{
public static string ToYyyyMMdd(this DateTime date)
{
return date.ToString("yyyyMMdd", CultureInfo.InvariantCulture);
}
}

使用例です。

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

string result = date.ToYyyyMMdd();

Console.WriteLine(result); // 20260619

文字列からDateTimeへ変換する処理もメソッド化できます。

C#
using System;
using System.Globalization;

public static class DateParser
{
public static bool TryParseYyyyMMdd(string? text, out DateTime date)
{
if (string.IsNullOrWhiteSpace(text))
{
date = default;
return false;
}

return DateTime.TryParseExact(
text,
"yyyyMMdd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out date
);
}
}

使用例です。

C#
if (DateParser.TryParseYyyyMMdd("20260619", out DateTime date))
{
Console.WriteLine(date.ToString("yyyy-MM-dd"));
}
else
{
Console.WriteLine("日付が不正です。");
}

共通処理としてまとめておくことで、フォーマットの指定ミスやカルチャ指定漏れを防ぎやすくなります。

5-5. nullable DateTimeを扱う場合の書き方

DateTime?のようなnullable型を扱う場合は、値があるかどうかを確認してから変換します。

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

string? result = date?.ToString("yyyyMMdd", CultureInfo.InvariantCulture);

Console.WriteLine(result); // 20260619

datenullの場合、結果もnullになります。

C#
DateTime? date = null;

string? result = date?.ToString("yyyyMMdd", CultureInfo.InvariantCulture);

Console.WriteLine(result); // null

空文字を返したい場合は、null合体演算子を使います。

C#
DateTime? date = null;

string result = date?.ToString("yyyyMMdd", CultureInfo.InvariantCulture) ?? "";

Console.WriteLine(result); // 空文字

メソッド化する場合は次のように書けます。

C#
public static string ToYyyyMMddOrEmpty(DateTime? date)
{
return date?.ToString("yyyyMMdd", CultureInfo.InvariantCulture) ?? "";
}

nullを許容する設計なのか、空文字に変換する設計なのかは、システムの仕様に合わせて決めることが重要です。

6. yyyyMMdd形式を使う際の注意点

6-1. 日付型と文字列型を混同しない

yyyyMMddは日付の表示形式であり、日付型そのものではありません。

C#
DateTime date = new DateTime(2026, 6, 19);
string text = date.ToString("yyyyMMdd");

この場合、dateDateTime型、textstring型です。

日付の加算や比較を行う場合は、DateTime型のまま処理します。

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

DateTime nextDay = date.AddDays(1);

Console.WriteLine(nextDay.ToString("yyyyMMdd")); // 20260620

文字列のまま日付計算をしようとすると、処理が複雑になり、バグの原因になります。

C#
// 避けたい例
string yyyymmdd = "20260619";
// 文字列のまま日付計算しようとしない

基本的には、内部処理ではDateTime、外部出力ではyyyyMMdd文字列、という役割分担にすると分かりやすくなります。

6-2. データベース保存時の型選び

データベースに日付を保存する場合、可能であれば日付型を使うのが基本です。

SQL Server : date, datetime, datetime2
MySQL : DATE, DATETIME
PostgreSQL : date, timestamp

yyyyMMdd形式の文字列として保存すると、日付としての制約や計算が扱いにくくなることがあります。

たとえば、日付型で保存していれば、日付の範囲検索が自然に書けます。

SQL
WHERE order_date BETWEEN '2026-06-01' AND '2026-06-30'

一方、外部システムの仕様でyyyyMMdd形式の文字列保存が必要な場合もあります。その場合でも、アプリケーション側ではDateTimeに変換してから処理すると安全です。

C#
string dbValue = "20260619";

if (DateTime.TryParseExact(
dbValue,
"yyyyMMdd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
Console.WriteLine(date);
}

保存形式とアプリケーション内部の型は分けて考えることが大切です。

6-3. API・CSV・ファイル名で使う場合の注意点

APIやCSVでyyyyMMdd形式を使う場合は、仕様書に記載されたフォーマットと完全に一致させる必要があります。

C#
var requestDate = DateTime.Today.ToString("yyyyMMdd", CultureInfo.InvariantCulture);

CSV出力では、日付がExcelなどで自動変換されることがあります。20260619のような値が数値として扱われる場合もあるため、取り込み側の仕様も確認しておくと安心です。

ファイル名で使う場合は、yyyyMMdd形式は扱いやすいです。

C#
string fileName = $"backup_{DateTime.Now:yyyyMMdd}.zip";

時刻まで含めたい場合は、yyyyMMddHHmmss形式にするとファイル名の重複を避けやすくなります。

C#
string fileName = $"backup_{DateTime.Now:yyyyMMddHHmmss}.zip";

ただし、ファイル名に使う日時がローカル時刻なのかUTCなのかは、システムの運用ルールに合わせる必要があります。

6-4. タイムゾーンやUTCを考慮するケース

yyyyMMdd形式は日付だけを表すため、時刻やタイムゾーンの情報は含まれません。

そのため、次のようなケースでは注意が必要です。

・海外ユーザーが利用するサービス
・UTCで日時を管理しているシステム
・日付の境界をまたぐバッチ処理
・クラウド環境で実行する処理
・APIの仕様でUTCが指定されている場合

たとえば、UTCの日付をyyyyMMdd形式にしたい場合は、DateTime.UtcNowを使います。

C#
string utcDate = DateTime.UtcNow.ToString("yyyyMMdd", CultureInfo.InvariantCulture);

一方、日本時間の日付を使いたい場合は、サーバーのローカル時刻に依存せず、タイムゾーンを明示して変換することもあります。

C#
TimeZoneInfo tokyoTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");

DateTime utcNow = DateTime.UtcNow;
DateTime tokyoNow = TimeZoneInfo.ConvertTimeFromUtc(utcNow, tokyoTimeZone);

string result = tokyoNow.ToString("yyyyMMdd", CultureInfo.InvariantCulture);

Windows環境では"Tokyo Standard Time"を使うことが多いですが、環境によってタイムゾーンIDの扱いが異なる場合があります。クロスプラットフォームで動かす場合は、実行環境のタイムゾーンIDを確認しておきましょう。

6-5. DateTimeOffsetを使うべきケース

タイムゾーンやUTCとの差を明確に扱いたい場合は、DateTimeよりもDateTimeOffsetが適していることがあります。

C#
DateTimeOffset now = DateTimeOffset.Now;

string result = now.ToString("yyyyMMdd", CultureInfo.InvariantCulture);

Console.WriteLine(result);

DateTimeOffsetは、日時とUTCからのオフセットを持っています。

C#
DateTimeOffset dateTimeOffset = new DateTimeOffset(2026, 6, 19, 10, 0, 0, TimeSpan.FromHours(9));

Console.WriteLine(dateTimeOffset); // 2026/06/19 10:00:00 +09:00
Console.WriteLine(dateTimeOffset.ToString("yyyyMMdd")); // 20260619

API連携やログ、複数地域で利用するシステムでは、DateTimeOffsetを使うことで、どのタイムゾーンの日時なのかを明確にしやすくなります。

ただし、yyyyMMdd形式に変換した時点で、時刻やオフセット情報は文字列には含まれません。必要な情報を失わないように、どの段階でyyyyMMddに変換するかを考えることが重要です。

7. yyyyMMdd形式に関するよくある質問

7-1. yyyyMMddをint型に変換してもよいか

yyyyMMddは数字だけなので、int型に変換したくなることがあります。

C#
string text = "20260619";

int value = int.Parse(text);

Console.WriteLine(value); // 20260619

技術的には可能ですが、基本的には文字列として扱うことをおすすめします。

理由は、yyyyMMddは数値ではなく日付を表すコードだからです。足し算や引き算をする値ではありません。

C#
int value = 20260619;

Console.WriteLine(value + 1); // 20260620 になるが、日付計算として正しいとは限らない

たとえば、20260630 + 120260631になりますが、2026年6月31日は存在しません。

日付計算をしたい場合は、DateTimeに変換してから行います。

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

DateTime nextDay = date.AddDays(1);

Console.WriteLine(nextDay.ToString("yyyyMMdd")); // 20260701

yyyyMMddは、基本的にstringまたはDateTimeとして扱うのが安全です。

7-2. yyyyMMddHHmmss形式にするにはどうするか

年月日に加えて時分秒も含めたい場合は、yyyyMMddHHmmssを使います。

C#
DateTime now = new DateTime(2026, 6, 19, 15, 30, 45);

string result = now.ToString("yyyyMMddHHmmss", CultureInfo.InvariantCulture);

Console.WriteLine(result); // 20260619153045

内訳は次のとおりです。

yyyy : 年
MM : 月
dd : 日
HH : 時間 24時間表記
mm : 分
ss : 秒

ここでも、MMmmの違いに注意してください。

MM : 月
mm : 分

ファイル名に日時を含める場合にも便利です。

C#
string fileName = $"log_{DateTime.Now:yyyyMMddHHmmss}.txt";

文字列からDateTimeに変換する場合は、同じフォーマットを指定します。

C#
string text = "20260619153045";

DateTime date = DateTime.ParseExact(
text,
"yyyyMMddHHmmss",
CultureInfo.InvariantCulture
);

Console.WriteLine(date); // 2026/06/19 15:30:45

7-3. スラッシュ付きの日付をyyyyMMddに変換するには

2026/06/19のようなスラッシュ付きの日付をyyyyMMddに変換するには、いったんDateTimeに変換してからToString("yyyyMMdd")を使います。

C#
string input = "2026/06/19";

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

string result = date.ToString("yyyyMMdd", CultureInfo.InvariantCulture);

Console.WriteLine(result); // 20260619

月や日がゼロ埋めされていない場合は、フォーマットをyyyy/M/dにします。

C#
string input = "2026/6/9";

DateTime date = DateTime.ParseExact(
input,
"yyyy/M/d",
CultureInfo.InvariantCulture
);

string result = date.ToString("yyyyMMdd", CultureInfo.InvariantCulture);

Console.WriteLine(result); // 20260609

複数の入力形式に対応したい場合は、フォーマットの配列を指定できます。

C#
string input = "2026/6/9";

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

if (DateTime.TryParseExact(
input,
formats,
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
string result = date.ToString("yyyyMMdd", CultureInfo.InvariantCulture);
Console.WriteLine(result);
}
else
{
Console.WriteLine("日付形式が不正です。");
}

7-4. 文字列の日付が8桁か判定するには

文字列が8桁の数字かどうかを判定するには、Lengthchar.IsDigitを使います。

C#
string text = "20260619";

bool isEightDigits = text.Length == 8 && text.All(char.IsDigit);

Console.WriteLine(isEightDigits); // True

nullの可能性がある場合は、次のように書きます。

C#
string? text = "20260619";

bool isEightDigits =
!string.IsNullOrEmpty(text) &&
text.Length == 8 &&
text.All(char.IsDigit);

Console.WriteLine(isEightDigits); // True

ただし、8桁の数字であることと、正しい日付であることは別です。

C#
string text = "20260230";

bool isEightDigits = text.Length == 8 && text.All(char.IsDigit);

Console.WriteLine(isEightDigits); // True

このように、存在しない日付でも8桁チェックだけなら通ってしまいます。

日付として正しいかどうかも確認する場合は、TryParseExactを使います。

C#
public static bool IsValidYyyyMMdd(string? text)
{
if (string.IsNullOrWhiteSpace(text))
{
return false;
}

return DateTime.TryParseExact(
text,
"yyyyMMdd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out _
);
}

7-5. .NET Frameworkと.NETで書き方に違いはあるか

基本的な書き方は、.NET Frameworkでも.NETでも同じです。

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

string result = date.ToString("yyyyMMdd", CultureInfo.InvariantCulture);

文字列からDateTimeへ変換する場合も同じように書けます。

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

TryParseExactも同様に使えます。

C#
bool success = DateTime.TryParseExact(
"20260619",
"yyyyMMdd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date
);

ただし、C#の言語バージョンによっては、nullable参照型のstring?などが使えない場合があります。

C#
// 新しいC#でよく使う書き方
string? text = null;

古いプロジェクトでは、次のように通常のstringとして扱うことがあります。

C#
string text = null;

日付フォーマットの指定方法自体は大きく変わりません。重要なのは、yyyyMMddの指定、CultureInfo.InvariantCultureの指定、ParseExactまたはTryParseExactの使い分けです。

まとめ

C#で日付をyyyyMMdd形式に変換するには、DateTime.ToString("yyyyMMdd")を使います。

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

string result = date.ToString("yyyyMMdd", CultureInfo.InvariantCulture);

Console.WriteLine(result); // 20260619

現在日付をyyyyMMdd形式にしたい場合は、次のように書けます。

C#
string today = DateTime.Today.ToString("yyyyMMdd", CultureInfo.InvariantCulture);

反対に、yyyyMMdd形式の文字列をDateTimeへ変換する場合は、ParseExactまたはTryParseExactを使います。

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

外部入力やCSV、APIなど、不正な値が来る可能性がある場合はTryParseExactを使うと安全です。

C#
bool success = DateTime.TryParseExact(
"20260619",
"yyyyMMdd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date
);

yyyyMMdd形式を扱うときは、次の点に注意しましょう。

・年はyyyyを使う
・月はMMを使う
・分のmmと間違えない
・8桁の数字でも存在しない日付はある
・日付計算は文字列ではなくDateTimeで行う
・外部連携ではCultureInfo.InvariantCultureを指定すると安全
・タイムゾーンが関係する場合はDateTimeOffsetも検討する

yyyyMMddは実務でよく使われる便利な日付形式ですが、あくまで文字列表現です。内部処理ではDateTimeDateTimeOffsetを使い、表示・ファイル名・API連携など必要な場面でyyyyMMdd形式に変換するのが、C#で日付を安全に扱う基本です。