C#の日付型を完全解説|DateTimeの使い方・変換・比較・フォーマットまで初心者向けにわかりやすく紹介
はじめに
C#で日付や時刻を扱う処理は、アプリケーション開発で非常によく登場します。
たとえば、予約日、登録日時、更新日時、誕生日、請求期限、ログ出力、検索条件、JSONやデータベースとの連携など、日付型を正しく扱う場面は多くあります。
C#には、日付や時刻を扱うための代表的な型として、DateTime、DateOnly、TimeOnly、DateTimeOffset、TimeSpanなどがあります。特に初心者が最初に理解すべきなのは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を押さえ、その後に用途に応じてDateOnly、TimeOnly、DateTimeOffsetを学ぶのがおすすめです。
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
日付だけを比較したい場合にも、TodayやDateプロパティがよく使われます。
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 | ローカル時刻 |
Utc | UTC |
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桁で表示したい場合は、Mやdを使います。
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 |
| フォーマットが違う | 20260609をyyyy/MM/ddとして変換 |
| 空文字 | "" |
| null | null |
| カルチャが合わない | 06/09/2026の解釈違い |
| 余計な文字がある | 2026年06月09日です |
特に、MMとmmの違いには注意が必要です。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 > deadlineはtrueになります。
「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で使えない点に注意
DateOnlyとTimeOnlyは、比較的新しい.NETで使える型です。
古い.NET Frameworkでは利用できません。そのため、既存の.NET FrameworkプロジェクトではDateTimeを使う必要があります。
新規開発で.NET 6以降を使う場合は、用途に応じてDateOnlyやTimeOnlyを検討するとよいでしょう。
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);
ただし、DateTimeKindがUnspecifiedの場合、意図しない変換になることがあります。タイムゾーンを扱う処理では、日時がローカルなのか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 | 長い日付と長い時刻 |
o | ISO 8601形式に近い往復可能形式 |
9-2. よく使うカスタム書式指定子
カスタム書式指定子を使うと、自由に表示形式を指定できます。
| 指定子 | 意味 |
|---|---|
yyyy | 4桁の年 |
yy | 2桁の年 |
MM | 2桁の月 |
M | 1桁または2桁の月 |
dd | 2桁の日 |
d | 1桁または2桁の日 |
HH | 24時間表記の時 |
hh | 12時間表記の時 |
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
固定桁で表示したい場合は、HH、mm、ssのように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. 日付フォーマットの大文字・小文字の違い
日付フォーマットでは、大文字と小文字で意味が変わります。
特に注意すべきなのは、MMとmmです。
| 指定子 | 意味 |
|---|---|
MM | 月 |
mm | 分 |
HH | 24時間表記 |
hh | 12時間表記 |
間違った例です。
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ではなくTryParseやTryParseExactを使うのが安全です。
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 | 型をdatetime、datetime2、dateなどから適切に選ぶ |
| JSON | ISO 8601形式を使う |
| API | UTCかローカル時刻かを統一する |
| 画面表示 | ユーザー向けの形式に変換する |
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の基本操作、文字列変換、比較、計算を押さえれば、多くの実務処理に対応できます。

