C#の日付型を完全解説|DateTimeの使い方・変換・比較・フォーマットまで初心者向けにわかりやすく紹介

はじめに

C#で日付や時刻を扱う処理は、アプリケーション開発で非常によく登場します。

たとえば、予約日、登録日時、更新日時、誕生日、請求期限、ログ出力、検索条件、JSONやデータベースとの連携など、日付型を正しく扱う場面は多くあります。

C#には、日付や時刻を扱うための代表的な型として、DateTimeDateOnlyTimeOnlyDateTimeOffsetTimeSpanなどがあります。特に初心者が最初に理解すべきなのはDateTimeです。

この記事では、C#の日付型について、基本から文字列変換、比較、計算、フォーマット、タイムゾーン、よくあるエラー、実務で使えるサンプルコードまでわかりやすく解説します。

1. C#の日付型とは?まず押さえるべき基本

C#の日付型とは、日付や時刻をプログラム上で扱うための型です。

文字列として"2026/06/09"のように保存することもできますが、文字列のままでは日付の比較や計算がしにくくなります。そのため、C#では日付専用の型を使って、安全かつ正確に日付処理を行います。

1-1. C#で日付・時刻を扱う代表的な型一覧

C#でよく使う日付・時刻関連の型は次のとおりです。

用途
DateTime日付と時刻を扱う
DateOnly日付だけを扱う
TimeOnly時刻だけを扱う
DateTimeOffsetタイムゾーンのオフセット付き日時を扱う
TimeSpan時間の間隔や差分を扱う

最もよく使われるのはDateTimeです。日付と時刻をまとめて扱えるため、多くの業務システムやWebアプリケーションで使われています。

1-2. DateTime・DateOnly・TimeOnly・DateTimeOffset・TimeSpanの違い

それぞれの違いを簡単に整理すると、次のようになります。

DateTimeは「2026年6月9日 10時30分」のように、日付と時刻をセットで扱う型です。

C#
DateTime now = DateTime.Now;

DateOnlyは「2026年6月9日」のように、日付だけを扱う型です。

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

TimeOnlyは「10時30分」のように、時刻だけを扱う型です。

C#
TimeOnly time = new TimeOnly(10, 30);

DateTimeOffsetは、日時に加えてUTCとの差分を持つ型です。

C#
DateTimeOffset offsetNow = DateTimeOffset.Now;

TimeSpanは、2つの日付の差や、3日間、2時間30分などの期間を表す型です。

C#
TimeSpan span = TimeSpan.FromDays(3);

1-3. 初心者はまずDateTimeを理解すればよい理由

初心者は、まずDateTimeを理解すれば問題ありません。

理由は、DateTimeがC#の日付処理で最も基本的かつ利用頻度の高い型だからです。現在日時の取得、日付の作成、文字列への変換、比較、加算・減算など、多くの日付処理をDateTimeだけで扱えます。

C#
DateTime today = DateTime.Today;
DateTime tomorrow = today.AddDays(1);

日付型の基本を学ぶなら、まずDateTimeを押さえ、その後に用途に応じてDateOnlyTimeOnlyDateTimeOffsetを学ぶのがおすすめです。

1-4. 日付型と文字列型の違い

日付型と文字列型はまったく別のものです。

文字列型は、単なる文字の並びです。

C#
string dateText = "2026/06/09";

一方、日付型は日付として計算や比較ができます。

C#
DateTime date = new DateTime(2026, 6, 9);
DateTime nextDay = date.AddDays(1);

文字列のままだと、「翌日を求める」「月末を求める」「期限切れか判定する」といった処理が難しくなります。日付として扱う値は、できるだけDateTimeなどの日付型に変換して処理しましょう。

1-5. 日付型を使う主な場面

C#の日付型は、次のような場面でよく使われます。

場面
現在日時の取得登録日時、更新日時
日付の表示yyyy/MM/dd形式で画面表示
日付の比較期限切れ判定
日付の計算1週間後、翌月末を求める
入力チェック日付文字列が正しいか確認
データ連携SQL Server、JSON、APIとの連携

実務では、日付型を正しく扱えるかどうかが不具合の少なさに直結します。

2. DateTime型の基本的な使い方

2-1. DateTime型とは

DateTime型は、日付と時刻を扱うための構造体です。

たとえば、次のような値を表現できます。

C#
2026年6月9日 15時30分00秒

C#では次のように宣言します。

C#
DateTime dateTime = new DateTime(2026, 6, 9, 15, 30, 0);

年月日だけでなく、時分秒まで保持できる点が特徴です。

2-2. 現在日時を取得する方法

現在の日時を取得するには、DateTime.Nowを使います。

C#
DateTime now = DateTime.Now;
Console.WriteLine(now);

DateTime.Nowは、実行環境のローカル日時を返します。

UTCの現在日時を取得したい場合は、DateTime.UtcNowを使います。

C#
DateTime utcNow = DateTime.UtcNow;
Console.WriteLine(utcNow);

日本国内向けの通常の画面表示ではDateTime.Nowを使うことが多いですが、海外ユーザーやサーバー間連携ではUtcNowの利用も検討します。

2-3. 今日の日付だけを取得する方法

今日の日付だけを取得したい場合は、DateTime.Todayを使います。

C#
DateTime today = DateTime.Today;
Console.WriteLine(today);

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

C#
DateTime today = DateTime.Today;
Console.WriteLine(today.ToString("yyyy/MM/dd HH:mm:ss"));

出力例です。

C#
2026/06/09 00:00:00

日付だけを比較したい場合にも、TodayDateプロパティがよく使われます。

2-4. 任意の日付を作成する方法

任意の日付を作るには、new DateTimeを使います。

C#
DateTime date = new DateTime(2026, 6, 9);
Console.WriteLine(date);

時刻まで指定することもできます。

C#
DateTime dateTime = new DateTime(2026, 6, 9, 10, 30, 0);
Console.WriteLine(dateTime);

引数の順番は、年、月、日、時、分、秒です。

C#
new DateTime(, , , , , )

存在しない日付を指定するとエラーになります。

C#
DateTime invalidDate = new DateTime(2026, 2, 30);

2月30日は存在しないため、例外が発生します。

2-5. 年・月・日・時・分・秒を取得する方法

DateTimeから年、月、日、時、分、秒を取得するには、各プロパティを使います。

C#
DateTime now = DateTime.Now;

Console.WriteLine(now.Year);
Console.WriteLine(now.Month);
Console.WriteLine(now.Day);
Console.WriteLine(now.Hour);
Console.WriteLine(now.Minute);
Console.WriteLine(now.Second);

曜日を取得する場合は、DayOfWeekを使います。

C#
Console.WriteLine(now.DayOfWeek);

年だけ、月だけ、日だけを取り出したい場合に便利です。

2-6. DateTimeKindとは

DateTimeには、Kindというプロパティがあります。

DateTimeKindは、その日時がローカル時刻なのか、UTCなのか、不明なのかを表します。

意味
Localローカル時刻
UtcUTC
Unspecified指定なし
C#
DateTime localTime = DateTime.Now;
DateTime utcTime = DateTime.UtcNow;

Console.WriteLine(localTime.Kind);
Console.WriteLine(utcTime.Kind);

タイムゾーン変換を行う場合、このKindの違いが重要になります。特に海外ユーザー向けシステムでは、DateTimeKindを意識しないと日付がずれる原因になります。

3. C#で日付を文字列に変換する方法

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

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

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

Console.WriteLine(text);

ただし、引数なしのToString()は実行環境のカルチャ設定に影響されます。そのため、画面表示やファイル出力で形式を固定したい場合は、フォーマットを指定するのがおすすめです。

3-2. yyyy/MM/dd形式で表示する方法

yyyy/MM/dd形式で表示するには、次のように書きます。

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

Console.WriteLine(text);

出力例です。

C#
2026/06/09

yyyyは4桁の年、MMは2桁の月、ddは2桁の日を表します。

3-3. yyyy年MM月dd日形式で表示する方法

日本語の年月日形式で表示する場合は、次のように指定します。

C#
DateTime date = new DateTime(2026, 6, 9);
string text = date.ToString("yyyy年MM月dd日");

Console.WriteLine(text);

出力例です。

C#
2026年06月09日

月や日を1桁で表示したい場合は、Mdを使います。

C#
string text = date.ToString("yyyy年M月d日");

出力例です。

C#
2026年6月9日

3-4. 時刻まで含めて表示する方法

時刻まで表示するには、HH:mm:ssを使います。

C#
DateTime dateTime = new DateTime(2026, 6, 9, 15, 30, 45);
string text = dateTime.ToString("yyyy/MM/dd HH:mm:ss");

Console.WriteLine(text);

出力例です。

C#
2026/06/09 15:30:45

HHは24時間表記の時、mmは分、ssは秒です。

3-5. 曜日を表示する方法

曜日を表示するには、dddまたはddddを使います。

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

Console.WriteLine(date.ToString("ddd"));
Console.WriteLine(date.ToString("dddd"));

日本語で曜日を表示したい場合は、カルチャを指定します。

C#
using System.Globalization;

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

Console.WriteLine(date.ToString("dddd", culture));

3-6. カルチャを指定して日付を表示する方法

日付の表示形式は、カルチャによって変わります。

C#
using System.Globalization;

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

Console.WriteLine(date.ToString("D", new CultureInfo("ja-JP")));
Console.WriteLine(date.ToString("D", new CultureInfo("en-US")));

日本語環境と英語環境で表示を切り替えたい場合に便利です。

実務では、ユーザー向け表示はカルチャを意識し、システム連携用の文字列はyyyy-MM-ddやISO 8601形式のように固定形式を使うのが安全です。

4. 文字列を日付型に変換する方法

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

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

C#
string text = "2026/06/09";
DateTime date = DateTime.Parse(text);

Console.WriteLine(date);

ただし、Parseは変換できない文字列が渡されると例外が発生します。

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

このようなコードはエラーになります。ユーザー入力を扱う場合は、次に紹介するTryParseを使うのが安全です。

4-2. TryParseで安全に日付変換する

DateTime.TryParseは、変換に成功したかどうかをboolで返します。

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

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

TryParseを使えば、変換に失敗しても例外が発生しません。

ユーザーが入力した日付を処理する場合は、ParseよりTryParseを優先するのがおすすめです。

4-3. ParseExactで指定フォーマットの日付を変換する

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

C#
using System.Globalization;

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

Console.WriteLine(date);

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

たとえば、yyyyMMddを指定した場合、2026/06/09は変換できません。

4-4. TryParseExactでエラーを防ぐ方法

指定フォーマットで安全に変換したい場合は、TryParseExactを使います。

C#
using System.Globalization;

string text = "20260609";

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

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

日付形式が厳密に決まっているCSV、固定長ファイル、API連携などでは、TryParseExactがよく使われます。

4-5. 変換できない日付文字列の原因

文字列を日付に変換できない主な原因は次のとおりです。

原因
存在しない日付2026/02/30
フォーマットが違う20260609yyyy/MM/ddとして変換
空文字""
nullnull
カルチャが合わない06/09/2026の解釈違い
余計な文字がある2026年06月09日です

特に、MMmmの違いには注意が必要です。MMは月、mmは分を表します。

4-6. nullや空文字を扱うときの注意点

nullや空文字を日付に変換しようとすると、エラーや変換失敗の原因になります。

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;

DateTime?は、日付またはnullを保持できる型です。

5. DateTimeの日付比較の方法

5-1. 日付が同じか比較する

DateTime同士が同じか比較するには、==を使います。

C#
DateTime date1 = new DateTime(2026, 6, 9);
DateTime date2 = new DateTime(2026, 6, 9);

if (date1 == date2)
{
Console.WriteLine("同じ日時です");
}

ただし、DateTimeは時刻まで含めて比較されます。

C#
DateTime date1 = new DateTime(2026, 6, 9, 0, 0, 0);
DateTime date2 = new DateTime(2026, 6, 9, 10, 0, 0);

Console.WriteLine(date1 == date2);

この場合、日付は同じでも時刻が違うためfalseになります。

5-2. 日付の前後を比較する

日付の前後を比較するには、<>を使います。

C#
DateTime today = DateTime.Today;
DateTime deadline = new DateTime(2026, 6, 30);

if (today < deadline)
{
Console.WriteLine("期限前です");
}
else if (today > deadline)
{
Console.WriteLine("期限を過ぎています");
}
else
{
Console.WriteLine("期限日です");
}

期限切れ判定や予約日のチェックでよく使います。

5-3. Dateプロパティで日付部分だけを比較する

時刻を無視して日付だけ比較したい場合は、Dateプロパティを使います。

C#
DateTime date1 = new DateTime(2026, 6, 9, 8, 0, 0);
DateTime date2 = new DateTime(2026, 6, 9, 20, 0, 0);

if (date1.Date == date2.Date)
{
Console.WriteLine("同じ日付です");
}

Dateプロパティは、時刻部分を00:00:00にしたDateTimeを返します。

日付だけ比較したい場面では、date1 == date2ではなくdate1.Date == date2.Dateを使いましょう。

5-4. CompareToメソッドで比較する

CompareToメソッドを使って日付を比較することもできます。

C#
DateTime date1 = new DateTime(2026, 6, 9);
DateTime date2 = new DateTime(2026, 6, 10);

int result = date1.CompareTo(date2);

if (result < 0)
{
Console.WriteLine("date1はdate2より前です");
}
else if (result > 0)
{
Console.WriteLine("date1はdate2より後です");
}
else
{
Console.WriteLine("同じ日時です");
}

戻り値は、前なら負の値、同じなら0、後なら正の値です。

5-5. 期間内の日付か判定する

ある日付が開始日から終了日の範囲内か判定するには、次のように書きます。

C#
DateTime target = new DateTime(2026, 6, 15);
DateTime start = new DateTime(2026, 6, 1);
DateTime end = new DateTime(2026, 6, 30);

if (target >= start && target <= end)
{
Console.WriteLine("期間内です");
}
else
{
Console.WriteLine("期間外です");
}

キャンペーン期間、契約期間、予約可能期間などの判定で使えます。

5-6. 日付比較でよくあるミス

日付比較でよくあるミスは、時刻部分を考慮していないことです。

C#
DateTime deadline = new DateTime(2026, 6, 9);
DateTime now = new DateTime(2026, 6, 9, 10, 0, 0);

Console.WriteLine(now > deadline);

この場合、同じ日付でもdeadlineの時刻は00:00:00のため、now > deadlinetrueになります。

「2026年6月9日中は有効」としたい場合は、終了日時を翌日の直前として扱うか、日付部分だけで比較する必要があります。

C#
if (now.Date <= deadline.Date)
{
Console.WriteLine("期限内です");
}

6. DateTimeの日付計算の方法

6-1. 日付に日数を足す・引く

日付に日数を足すには、AddDaysを使います。

C#
DateTime today = DateTime.Today;
DateTime tomorrow = today.AddDays(1);
DateTime yesterday = today.AddDays(-1);

Console.WriteLine(tomorrow);
Console.WriteLine(yesterday);

AddDays(7)なら7日後、AddDays(-7)なら7日前を取得できます。

6-2. 月数を足す・引く

月数を足すには、AddMonthsを使います。

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

DateTime nextMonth = date.AddMonths(1);
DateTime prevMonth = date.AddMonths(-1);

Console.WriteLine(nextMonth);
Console.WriteLine(prevMonth);

月末付近の日付では、自動的に存在する日付に調整されます。

C#
DateTime date = new DateTime(2026, 1, 31);
DateTime nextMonth = date.AddMonths(1);

Console.WriteLine(nextMonth);

2月31日は存在しないため、2月末の日付になります。

6-3. 年数を足す・引く

年数を足すには、AddYearsを使います。

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

DateTime nextYear = date.AddYears(1);
DateTime prevYear = date.AddYears(-1);

Console.WriteLine(nextYear);
Console.WriteLine(prevYear);

生年月日から年齢を計算する場合や、契約更新日を求める場合に使えます。

6-4. 時間・分・秒を足す・引く

時間を足すにはAddHours、分を足すにはAddMinutes、秒を足すにはAddSecondsを使います。

C#
DateTime now = DateTime.Now;

DateTime afterOneHour = now.AddHours(1);
DateTime afterThirtyMinutes = now.AddMinutes(30);
DateTime afterTenSeconds = now.AddSeconds(10);

Console.WriteLine(afterOneHour);
Console.WriteLine(afterThirtyMinutes);
Console.WriteLine(afterTenSeconds);

マイナス値を指定すれば、過去の日時を求められます。

C#
DateTime beforeOneHour = now.AddHours(-1);

6-5. 2つの日付の差分を求める

2つのDateTimeの差分を求めると、TimeSpanが返ります。

C#
DateTime start = new DateTime(2026, 6, 1);
DateTime end = new DateTime(2026, 6, 9);

TimeSpan diff = end - start;

Console.WriteLine(diff.Days);

出力例です。

C#
8

経過日数や処理時間を求めるときに便利です。

6-6. TimeSpanで経過日数や時間を取得する

TimeSpanを使うと、日数、時間、分、秒などを取得できます。

C#
DateTime start = new DateTime(2026, 6, 9, 9, 0, 0);
DateTime end = new DateTime(2026, 6, 9, 12, 30, 0);

TimeSpan diff = end - start;

Console.WriteLine(diff.Hours);
Console.WriteLine(diff.Minutes);
Console.WriteLine(diff.TotalHours);
Console.WriteLine(diff.TotalMinutes);

Hoursは時間部分だけ、TotalHoursは合計時間を表します。

たとえば3時間30分の場合、Hoursは3、TotalHoursは3.5になります。

6-7. 月末・翌月・前月の日付を求める

月初を求めるには、年と月を使って1日を作成します。

C#
DateTime date = DateTime.Today;
DateTime firstDay = new DateTime(date.Year, date.Month, 1);

Console.WriteLine(firstDay);

月末を求めるには、翌月の1日から1日引きます。

C#
DateTime firstDay = new DateTime(date.Year, date.Month, 1);
DateTime lastDay = firstDay.AddMonths(1).AddDays(-1);

Console.WriteLine(lastDay);

翌月や前月を求める場合は、AddMonthsを使います。

C#
DateTime nextMonth = date.AddMonths(1);
DateTime prevMonth = date.AddMonths(-1);

7. DateOnly・TimeOnlyの使い方

7-1. DateOnlyとは

DateOnlyは、日付だけを扱う型です。

C#
DateOnly date = new DateOnly(2026, 6, 9);
Console.WriteLine(date);

DateTimeのように時刻を持たないため、誕生日、営業日、予約日など、時刻が不要なデータに向いています。

7-2. TimeOnlyとは

TimeOnlyは、時刻だけを扱う型です。

C#
TimeOnly time = new TimeOnly(9, 30);
Console.WriteLine(time);

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

7-3. DateTimeとDateOnlyの違い

DateTimeは日付と時刻を持ちます。

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

DateOnlyは日付だけを持ちます。

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

日付だけを扱いたいのにDateTimeを使うと、時刻部分の00:00:00が比較や保存で問題になることがあります。

7-4. DateOnlyを使うべきケース

DateOnlyは、次のようなケースに向いています。

ケース
誕生日1990年1月1日
予約日2026年6月9日
営業日2026年6月10日
締切日2026年6月30日
記念日2026年12月1日

時刻が意味を持たない日付なら、DateOnlyを使うと意図が明確になります。

7-5. TimeOnlyを使うべきケース

TimeOnlyは、次のようなケースに向いています。

ケース
開店時刻09:00
閉店時刻18:00
休憩開始時刻12:00
アラーム時刻07:30
定期実行時刻03:00

日付が不要で、時刻だけを扱いたい場合に使います。

7-6. DateOnlyとDateTimeを相互変換する方法

DateTimeからDateOnlyへ変換するには、DateOnly.FromDateTimeを使います。

C#
DateTime dateTime = DateTime.Now;
DateOnly dateOnly = DateOnly.FromDateTime(dateTime);

Console.WriteLine(dateOnly);

DateOnlyからDateTimeへ変換するには、ToDateTimeを使います。

C#
DateOnly dateOnly = new DateOnly(2026, 6, 9);
TimeOnly timeOnly = new TimeOnly(0, 0);

DateTime dateTime = dateOnly.ToDateTime(timeOnly);

Console.WriteLine(dateTime);

時刻を指定する必要がある点に注意しましょう。

7-7. .NET Frameworkで使えない点に注意

DateOnlyTimeOnlyは、比較的新しい.NETで使える型です。

古い.NET Frameworkでは利用できません。そのため、既存の.NET FrameworkプロジェクトではDateTimeを使う必要があります。

新規開発で.NET 6以降を使う場合は、用途に応じてDateOnlyTimeOnlyを検討するとよいでしょう。

8. DateTimeOffsetとタイムゾーンの基本

8-1. DateTimeOffsetとは

DateTimeOffsetは、日時にUTCからのオフセット情報を加えた型です。

C#
DateTimeOffset now = DateTimeOffset.Now;
Console.WriteLine(now);

出力例です。

C#
2026/06/09 10:30:00 +09:00

+09:00は、UTCより9時間進んでいることを意味します。

8-2. DateTimeとDateTimeOffsetの違い

DateTimeは、日時そのものを表します。

C#
DateTime dateTime = DateTime.Now;

DateTimeOffsetは、日時に加えてUTCとの差分を保持します。

C#
DateTimeOffset dateTimeOffset = DateTimeOffset.Now;

タイムゾーンや海外ユーザーを意識するシステムでは、DateTimeOffsetの方が安全な場合があります。

8-3. UTCとローカル時刻の違い

UTCは、世界標準の基準時刻です。

ローカル時刻は、実行環境やユーザーの地域に応じた時刻です。

日本時間は通常、UTCより9時間進んでいます。

C#
DateTime localNow = DateTime.Now;
DateTime utcNow = DateTime.UtcNow;

Console.WriteLine(localNow);
Console.WriteLine(utcNow);

サーバー保存はUTC、画面表示はユーザーのローカル時刻に変換する設計がよく使われます。

8-4. ToUniversalTimeでUTCに変換する

ローカル時刻をUTCに変換するには、ToUniversalTimeを使います。

C#
DateTime localTime = DateTime.Now;
DateTime utcTime = localTime.ToUniversalTime();

Console.WriteLine(utcTime);

ただし、DateTimeKindUnspecifiedの場合、意図しない変換になることがあります。タイムゾーンを扱う処理では、日時がローカルなのかUTCなのかを明確にしておくことが重要です。

8-5. ToLocalTimeでローカル時刻に変換する

UTCをローカル時刻に変換するには、ToLocalTimeを使います。

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

Console.WriteLine(localTime);

APIやデータベースではUTCで保存し、画面表示時にローカル時刻へ変換する設計にすると、タイムゾーンによるずれを防ぎやすくなります。

8-6. TimeZoneInfoでタイムゾーンを扱う

特定のタイムゾーンに変換したい場合は、TimeZoneInfoを使います。

C#
DateTime utcTime = DateTime.UtcNow;

TimeZoneInfo tokyoTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
DateTime tokyoTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, tokyoTimeZone);

Console.WriteLine(tokyoTime);

Windows環境では"Tokyo Standard Time"のようなIDを使います。

タイムゾーンIDは実行環境によって異なる場合があるため、クロスプラットフォーム開発では注意が必要です。

8-7. 海外ユーザー向けシステムでの注意点

海外ユーザー向けシステムでは、次の点に注意しましょう。

注意点内容
保存時刻UTCで保存する
表示時刻ユーザーのタイムゾーンに変換する
日付だけの項目DateOnlyの利用も検討する
比較処理同じ基準時刻にそろえて比較する
夏時間TimeZoneInfoで扱う

特に、サーバーのローカル時刻に依存した処理は避けるのが安全です。

9. C#の日付フォーマット一覧

9-1. よく使う標準書式指定子

DateTime.ToStringでは、標準書式指定子を使えます。

C#
DateTime now = DateTime.Now;

Console.WriteLine(now.ToString("d"));
Console.WriteLine(now.ToString("D"));
Console.WriteLine(now.ToString("t"));
Console.WriteLine(now.ToString("T"));
Console.WriteLine(now.ToString("f"));
Console.WriteLine(now.ToString("F"));

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

指定子内容
d短い日付
D長い日付
t短い時刻
T長い時刻
f長い日付と短い時刻
F長い日付と長い時刻
oISO 8601形式に近い往復可能形式

9-2. よく使うカスタム書式指定子

カスタム書式指定子を使うと、自由に表示形式を指定できます。

指定子意味
yyyy4桁の年
yy2桁の年
MM2桁の月
M1桁または2桁の月
dd2桁の日
d1桁または2桁の日
HH24時間表記の時
hh12時間表記の時
mm
ss
fffミリ秒
ddd短い曜日
dddd長い曜日

MMは月、mmは分です。この違いは特に間違えやすいので注意しましょう。

9-3. 年月日のフォーマット例

年月日の代表的なフォーマット例です。

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

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

出力例です。

C#
2026/06/09
2026-06-09
20260609
2026年6月9日

9-4. 時分秒のフォーマット例

時刻の代表的なフォーマット例です。

C#
DateTime dateTime = new DateTime(2026, 6, 9, 15, 5, 8);

Console.WriteLine(dateTime.ToString("HH:mm:ss"));
Console.WriteLine(dateTime.ToString("H:m:s"));
Console.WriteLine(dateTime.ToString("yyyy/MM/dd HH:mm:ss"));

出力例です。

C#
15:05:08
15:5:8
2026/06/09 15:05:08

固定桁で表示したい場合は、HHmmssのように2文字で指定します。

9-5. ミリ秒を表示する方法

ミリ秒を表示するには、fffを使います。

C#
DateTime now = DateTime.Now;
Console.WriteLine(now.ToString("yyyy/MM/dd HH:mm:ss.fff"));

出力例です。

C#
2026/06/09 15:30:45.123

ログ出力や処理時間の確認で使うことがあります。

9-6. ISO 8601形式で出力する方法

ISO 8601形式で出力したい場合は、o指定子を使えます。

C#
DateTime now = DateTime.UtcNow;
Console.WriteLine(now.ToString("o"));

また、よく使われる形式として次のように指定することもあります。

C#
DateTime now = DateTime.UtcNow;
Console.WriteLine(now.ToString("yyyy-MM-ddTHH:mm:ss"));

APIやJSON連携では、ISO 8601形式がよく使われます。

9-7. 日付フォーマットの大文字・小文字の違い

日付フォーマットでは、大文字と小文字で意味が変わります。

特に注意すべきなのは、MMmmです。

指定子意味
MM
mm
HH24時間表記
hh12時間表記

間違った例です。

C#
DateTime now = DateTime.Now;
Console.WriteLine(now.ToString("yyyy/mm/dd"));

この場合、mmは月ではなく分として扱われます。

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

C#
Console.WriteLine(now.ToString("yyyy/MM/dd"));

10. C#の日付型でよくあるエラーと対処法

10-1. 文字列から日付に変換できない

文字列から日付に変換できない場合は、日付形式が正しいか確認します。

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

if (DateTime.TryParse(text, out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("日付に変換できません");
}

存在しない日付や形式が異なる文字列は変換できません。

入力値を扱う場合は、ParseではなくTryParseTryParseExactを使うのが安全です。

10-2. 想定と違う日付フォーマットになる

ToString()を引数なしで使うと、環境によって表示形式が変わることがあります。

C#
DateTime date = DateTime.Now;
Console.WriteLine(date.ToString());

表示形式を固定したい場合は、明示的にフォーマットを指定しましょう。

C#
Console.WriteLine(date.ToString("yyyy/MM/dd"));

10-3. 日付比較が正しくできない

日付比較が正しくできない原因の多くは、時刻部分を考慮していないことです。

C#
DateTime date1 = new DateTime(2026, 6, 9, 0, 0, 0);
DateTime date2 = new DateTime(2026, 6, 9, 12, 0, 0);

Console.WriteLine(date1 == date2);

日付だけを比較したい場合は、Dateプロパティを使います。

C#
Console.WriteLine(date1.Date == date2.Date);

10-4. タイムゾーンで日付がずれる

UTCとローカル時刻の変換を誤ると、日付がずれることがあります。

たとえば、UTCの深夜時間を日本時間に変換すると、日付が翌日になる場合があります。

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

保存、比較、表示のどの段階でUTCを使うのか、ローカル時刻を使うのかを明確にしておくことが重要です。

10-5. DateTime.MinValueが混ざる

DateTimeの初期値はDateTime.MinValueです。

C#
DateTime date = default;
Console.WriteLine(date);

これは0001/01/01 00:00:00を表します。

未設定の日付としてDateTime.MinValueが混ざると、不具合の原因になります。未入力を表したい場合は、DateTime?を使いましょう。

10-6. nullを扱いたい場合はNullable DateTimeを使う

DateTimeは値型なので、通常はnullを入れられません。

C#
DateTime date = null;

これはコンパイルエラーになります。

nullを扱いたい場合は、DateTime?を使います。

C#
DateTime? date = null;

if (date.HasValue)
{
Console.WriteLine(date.Value);
}
else
{
Console.WriteLine("日付は未設定です");
}

10-7. SQL ServerやJSONとの日付連携で注意する点

SQL ServerやJSONと日付を連携する場合は、次の点に注意します。

連携先注意点
SQL Server型をdatetimedatetime2dateなどから適切に選ぶ
JSONISO 8601形式を使う
APIUTCかローカル時刻かを統一する
画面表示ユーザー向けの形式に変換する

DBやAPIでは日付を文字列として雑に扱うのではなく、可能な限り日付型として処理するのがおすすめです。

11. 実務で使える日付処理のサンプルコード

11-1. 今日の日付をyyyy/MM/ddで表示する

C#
DateTime today = DateTime.Today;
string text = today.ToString("yyyy/MM/dd");

Console.WriteLine(text);

出力例です。

C#
2026/06/09

画面表示や帳票出力でよく使う基本パターンです。

11-2. 入力された日付文字列をDateTimeに変換する

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

if (DateTime.TryParse(input, out DateTime date))
{
Console.WriteLine($"入力日付: {date:yyyy/MM/dd}");
}
else
{
Console.WriteLine("正しい日付を入力してください");
}

ユーザー入力を扱う場合は、例外を防ぐためにTryParseを使いましょう。

11-3. 生年月日から年齢を計算する

C#
DateTime birthday = new DateTime(1990, 6, 10);
DateTime today = DateTime.Today;

int age = today.Year - birthday.Year;

if (birthday.Date > today.AddYears(-age))
{
age--;
}

Console.WriteLine(age);

誕生日がまだ来ていない場合は、年齢から1を引きます。

11-4. 期限切れかどうかを判定する

C#
DateTime deadline = new DateTime(2026, 6, 30);
DateTime today = DateTime.Today;

if (today > deadline.Date)
{
Console.WriteLine("期限切れです");
}
else
{
Console.WriteLine("期限内です");
}

日付だけで判定したい場合は、Dateを使って時刻部分を無視します。

11-5. 月初と月末を取得する

C#
DateTime today = DateTime.Today;

DateTime firstDay = new DateTime(today.Year, today.Month, 1);
DateTime lastDay = firstDay.AddMonths(1).AddDays(-1);

Console.WriteLine($"月初: {firstDay:yyyy/MM/dd}");
Console.WriteLine($"月末: {lastDay:yyyy/MM/dd}");

請求期間や集計期間を求めるときによく使います。

11-6. 営業日や休日判定の考え方

土日を休日として判定する簡単な例です。

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

bool isWeekend = date.DayOfWeek == DayOfWeek.Saturday
|| date.DayOfWeek == DayOfWeek.Sunday;

if (isWeekend)
{
Console.WriteLine("休日です");
}
else
{
Console.WriteLine("営業日です");
}

祝日まで判定したい場合は、祝日リストを用意して判定します。

C#
List<DateTime> holidays = new List<DateTime>
{
new DateTime(2026, 1, 1),
new DateTime(2026, 2, 11)
};

DateTime date = new DateTime(2026, 1, 1);

bool isHoliday = holidays.Contains(date.Date);

Console.WriteLine(isHoliday ? "祝日です" : "祝日ではありません");

実務では、会社独自の休日や年末年始休暇も考慮する必要があります。

11-7. JSONの日付文字列をDateTimeに変換する

JSONから受け取った日付文字列をDateTimeに変換する例です。

C#
using System.Text.Json;

string json = """
{
"createdAt": "2026-06-09T10:30:00"
}
""";

var data = JsonSerializer.Deserialize<SampleData>(json);

Console.WriteLine(data.CreatedAt);

public class SampleData
{
public DateTime CreatedAt { get; set; }
}

JSONでは、yyyy-MM-ddTHH:mm:ssのようなISO 8601形式がよく使われます。

UTCかローカル時刻かが重要な場合は、DateTimeOffsetの利用も検討しましょう。

12. C#の日付型に関するよくある質問

12-1. C#に日付型はありますか?

はい、あります。

代表的な日付型はDateTimeです。日付だけを扱うDateOnly、時刻だけを扱うTimeOnly、タイムゾーンを考慮しやすいDateTimeOffsetもあります。

初心者はまずDateTimeを理解するのがおすすめです。

12-2. DateTimeとDateOnlyはどちらを使うべきですか?

日付と時刻の両方を扱うならDateTimeを使います。

日付だけを扱い、時刻が不要な場合はDateOnlyが適しています。

たとえば、登録日時や更新日時にはDateTime、誕生日や予約日にはDateOnlyが向いています。

12-3. 日付だけを扱うならDateTimeでも問題ありませんか?

問題なく使えます。

ただし、DateTimeは時刻も持つため、時刻部分が00:00:00として扱われます。その結果、比較処理で意図しない結果になることがあります。

日付だけを明確に扱いたい場合は、DateOnlyを使うと設計がわかりやすくなります。

12-4. DateTime.NowとDateTime.UtcNowの違いは何ですか?

DateTime.Nowは、実行環境のローカル時刻を返します。

DateTime.UtcNowは、UTCの現在時刻を返します。

日本国内だけの簡単なアプリではDateTime.Nowでも問題ないことが多いですが、サーバー保存や海外ユーザー対応ではDateTime.UtcNowを使う設計がよく使われます。

12-5. 日付を比較するときに時刻を無視するにはどうすればよいですか?

Dateプロパティを使います。

C#
DateTime date1 = new DateTime(2026, 6, 9, 10, 0, 0);
DateTime date2 = new DateTime(2026, 6, 9, 20, 0, 0);

if (date1.Date == date2.Date)
{
Console.WriteLine("同じ日付です");
}

Dateを使うと、時刻部分を00:00:00として比較できます。

12-6. 文字列の日付変換でParseとTryParseはどちらを使うべきですか?

ユーザー入力を扱う場合は、TryParseを使うべきです。

Parseは変換に失敗すると例外が発生します。一方、TryParseは変換に成功したかどうかをboolで返すため、安全に処理できます。

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

12-7. C#で日付をyyyyMMdd形式にするにはどうすればよいですか?

ToString("yyyyMMdd")を使います。

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

Console.WriteLine(text);

出力例です。

C#
20260609

ファイル名、ID、連携データなどでよく使われる形式です。

まとめ

C#の日付型を扱ううえで、まず理解すべき基本はDateTimeです。

DateTimeを使えば、現在日時の取得、任意の日付作成、文字列変換、比較、日付計算など、多くの日付処理を実装できます。

日付だけを扱う場合はDateOnly、時刻だけを扱う場合はTimeOnly、タイムゾーンやUTCとの差分を意識する場合はDateTimeOffset、期間や差分を扱う場合はTimeSpanを使います。

特に重要なポイントは次のとおりです。

ポイント内容
基本はDateTime初心者はまずDateTimeを理解する
表示形式はToStringで指定yyyy/MM/ddなどを使う
文字列変換はTryParseが安全ユーザー入力では例外を防ぐ
日付比較は時刻に注意日付だけならDateを使う
日付計算はAddDaysなどを使う日数・月数・年数を加減算できる
nullはDateTime?で扱う未入力の日付に対応できる
タイムゾーンは慎重に扱うUTCとローカル時刻を区別する

C#の日付型は、最初は覚えることが多く感じるかもしれません。しかし、DateTimeの基本操作、文字列変換、比較、計算を押さえれば、多くの実務処理に対応できます。