C# DateTimeの使い方完全ガイド|日付のみ取得・フォーマット変換・比較・DateOnlyまで解説

はじめに

C#で日付や時刻を扱うとき、もっともよく使われる型がDateTimeです。現在日時の取得、日付のみの表示、フォーマット変換、文字列からの日付変換、日付比較、期限判定など、多くの実務コードで登場します。

一方で、DateTime.NowDateTime.UtcNowの違い、日付だけを比較したいのに時刻まで比較されてしまう問題、タイムゾーンを含む処理、DateOnlyとの使い分けなど、初心者がつまずきやすいポイントも多いです。

この記事では、C#のDateTimeの基本から、日付のみの取得、フォーマット変換、比較、日付計算、DateOnlyTimeOnlyの使い方まで、実務で使える形で解説します。

1. C# DateTimeとは?日付・時刻を扱う基本

DateTimeは、C#で日付と時刻を表すための構造体です。年、月、日、時、分、秒、ミリ秒などを1つの値として扱えます。

たとえば「2026年6月15日 10時30分00秒」のような日時を表現できます。

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

DateTimeは.NETに標準で用意されている型で、日付計算、比較、フォーマット変換、文字列変換などの機能を持っています。Microsoftの公式ドキュメントでも、DateTimeは日付と時刻の値を表す構造体として定義されています。Microsoft Learn

1-1. DateTimeでできること

DateTimeを使うと、主に次のような処理ができます。

C#
// 現在日時を取得
DateTime now = DateTime.Now;

// 今日の日付を取得
DateTime today = DateTime.Today;

// 任意の日付を作成
DateTime birthday = new DateTime(1995, 4, 10);

// 日付を加算
DateTime nextWeek = today.AddDays(7);

// 文字列に変換
string text = today.ToString("yyyy-MM-dd");

// 日付を比較
bool isPast = birthday < today;

Webアプリ、業務システム、予約システム、ログ出力、請求処理、期限管理など、日付や時刻を扱う場面ではほぼ必ず登場します。

1-2. DateTimeとDateTimeOffsetの違い

DateTimeは日付と時刻を表しますが、タイムゾーンのオフセット情報を明確に持つ型ではありません。

一方、DateTimeOffsetは日時に加えてUTCからのオフセットを持ちます。

C#
DateTime now = DateTime.Now;

DateTimeOffset offsetNow = DateTimeOffset.Now;

Console.WriteLine(now);
Console.WriteLine(offsetNow);

出力例は次のようになります。

2026/06/15 10:30:00
2026/06/15 10:30:00 +09:00

+09:00のようなUTCとの差分を含めて扱いたい場合は、DateTimeOffsetが適しています。Microsoftの公式ドキュメントでも、DateTimeOffsetDateTimeよりタイムゾーン情報を保持しやすい型として説明されています。Microsoft Learn

1-3. DateTimeを使う場面と注意点

DateTimeは、次のような場面でよく使います。

C#
DateTime createdAt = DateTime.Now;
DateTime dueDate = new DateTime(2026, 6, 30);
DateTime loginDate = DateTime.UtcNow;

ただし、次の点には注意が必要です。

DateTime.Nowはローカル時刻を返します。日本で実行すれば日本時間、別のタイムゾーンのサーバーで実行すればその環境のローカル時刻になります。

DateTime.UtcNowはUTCの現在時刻を返します。グローバルなシステムやデータベース保存では、UTCで保存して表示時にローカル時刻へ変換する設計がよく使われます。

また、DateTimeにはKindというプロパティがあり、その値がLocalUtcUnspecifiedのいずれかになります。タイムゾーン変換を行う場合は、このKindを意識する必要があります。

1-4. C#で日付を扱う主な型一覧

C#で日付や時刻を扱う主な型は次のとおりです。

主な用途
DateTime日付と時刻を扱う
DateTimeOffsetUTCオフセット付きの日時を扱う
DateOnly日付のみを扱う
TimeOnly時刻のみを扱う
TimeSpan時間差や期間を扱う
TimeZoneInfoタイムゾーン情報を扱う

.NETには、日付・時刻関連の型としてDateTimeDateTimeOffsetDateOnlyTimeOnlyTimeSpanTimeZoneInfoなどが用意されています。Microsoft Learn

2. C# DateTimeの基本的な使い方

2-1. 現在の日付と時刻を取得する

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

C#
DateTime now = DateTime.Now;

Console.WriteLine(now);

出力例です。

2026/06/15 10:30:45

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

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

C#
DateTime utcNow = DateTime.UtcNow;

Console.WriteLine(utcNow);

ローカル時刻が必要な画面表示ではDateTime.Now、保存やAPI連携ではDateTime.UtcNowを使う、といった使い分けが一般的です。

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

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

C#
DateTime today = DateTime.Today;

Console.WriteLine(today);

出力例です。

2026/06/15 0:00:00

DateTime.Todayは日付部分が今日で、時刻部分が00:00:00DateTimeを返します。

2-3. 任意の日付を作成する

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

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

Console.WriteLine(date);

時刻も指定できます。

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

Console.WriteLine(dateTime);

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

C#
DateTime dateTime = new DateTime(year: 2026, month: 6, day: 15, hour: 14, minute: 30, second: 0);

存在しない日付を指定すると例外が発生します。

C#
// 2026年2月30日は存在しないため例外
DateTime invalidDate = new DateTime(2026, 2, 30);

2-4. 年・月・日・時・分・秒を取得する

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

C#
DateTime now = DateTime.Now;

int year = now.Year;
int month = now.Month;
int day = now.Day;
int hour = now.Hour;
int minute = now.Minute;
int second = now.Second;

Console.WriteLine(year);
Console.WriteLine(month);
Console.WriteLine(day);
Console.WriteLine(hour);
Console.WriteLine(minute);
Console.WriteLine(second);

画面表示や集計処理で、年や月だけを取り出したいときに便利です。

C#
DateTime orderDate = new DateTime(2026, 6, 15);

Console.WriteLine($"{orderDate.Year}年{orderDate.Month}月");

2-5. 曜日や日付の各要素を取得する

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

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

DayOfWeek dayOfWeek = date.DayOfWeek;

Console.WriteLine(dayOfWeek);

出力例です。

Monday

DayOfYearを使うと、その年の何日目かを取得できます。

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

Console.WriteLine(date.DayOfYear);

月の日数を取得するには、DateTime.DaysInMonthを使います。

C#
int days = DateTime.DaysInMonth(2026, 2);

Console.WriteLine(days);

うるう年も考慮されます。

C#
Console.WriteLine(DateTime.DaysInMonth(2024, 2)); // 29
Console.WriteLine(DateTime.DaysInMonth(2025, 2)); // 28

3. C#で日付のみを取得・表示する方法

3-1. DateTime.Todayで日付のみを取得する

日付のみを扱いたい場合、もっとも簡単なのはDateTime.Todayです。

C#
DateTime today = DateTime.Today;

Console.WriteLine(today);

DateTime.Todayは、今日の日付と00:00:00の時刻を持つDateTimeです。

C#
Console.WriteLine(today.ToString("yyyy-MM-dd"));

出力例です。

2026-06-15

「今日の日付を取得したい」「時刻はいらない」という場合に使いやすい方法です。

3-2. DateTime.Now.Dateで日付部分だけを取得する

DateTime.Now.Dateを使って、現在日時から日付部分だけを取り出すこともできます。

C#
DateTime now = DateTime.Now;
DateTime dateOnly = now.Date;

Console.WriteLine(dateOnly);

出力例です。

2026/06/15 0:00:00

Dateプロパティは、同じ年月日で時刻が00:00:00DateTimeを返します。

C#
DateTime dateOnly = DateTime.Now.Date;

今日の日付を取得するだけなら、DateTime.Todayのほうがシンプルです。

3-3. ToStringで日付だけを文字列表示する

DateTimeには時刻が含まれていても、表示時に日付だけを出すことができます。

C#
DateTime now = DateTime.Now;

string text = now.ToString("yyyy-MM-dd");

Console.WriteLine(text);

出力例です。

2026-06-15

スラッシュ区切りにする場合は、次のように書きます。

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

Console.WriteLine(text);

日本語形式にする場合は、次のように書きます。

C#
string text = now.ToString("yyyy年MM月dd日");

Console.WriteLine(text);

3-4. 時刻を含めずに日付を扱いたい場合の注意点

DateTime.TodayDateTime.Now.Dateは、見た目上は日付のみを扱っているように見えますが、型としてはDateTimeです。そのため、内部的には時刻00:00:00を持っています。

C#
DateTime date = DateTime.Today;

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

日付だけを比較したい場合、片方に時刻が含まれていると意図しない結果になることがあります。

C#
DateTime a = new DateTime(2026, 6, 15, 10, 0, 0);
DateTime b = new DateTime(2026, 6, 15, 0, 0, 0);

Console.WriteLine(a == b); // False

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

C#
Console.WriteLine(a.Date == b.Date); // True

3-5. DateOnlyを使って日付のみを扱う方法

.NET 6以降では、日付のみを表すDateOnlyが使えます。

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

Console.WriteLine(date);

DateOnlyは時刻を持たないため、生年月日、記念日、予約日、営業日など、日付だけが意味を持つデータに適しています。Microsoftの公式ドキュメントでも、DateOnlyは時刻を持たない特定の日付を表す構造体として説明されています。Microsoft Learn

C#
DateOnly today = DateOnly.FromDateTime(DateTime.Now);

Console.WriteLine(today);

日付のみを厳密に扱いたい場合は、DateTimeではなくDateOnlyを検討するとよいでしょう。

4. C# DateTimeのフォーマット変換

4-1. ToStringで日付を指定形式に変換する

DateTimeを指定した形式の文字列に変換するには、ToStringを使います。

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

string result = date.ToString("yyyy-MM-dd HH:mm:ss");

Console.WriteLine(result);

出力例です。

2026-06-15 09:05:03

カスタム書式を使うと、日付や時刻を自由に整形できます。Microsoftの公式ドキュメントでは、カスタム日付・時刻書式文字列はDateTimeDateTimeOffsetの文字列表現を定義するものとして説明されています。Microsoft Learn

4-2. yyyy/MM/dd形式に変換する

yyyy/MM/dd形式に変換するには、次のように書きます。

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

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

Console.WriteLine(text);

出力例です。

2026/06/15

月や日を2桁で表示したい場合はMMddを使います。

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

4-3. yyyy-MM-dd形式に変換する

yyyy-MM-dd形式は、API、CSV、JSON、データベース連携などでもよく使われます。

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

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

Console.WriteLine(text);

出力例です。

2026-06-15

日付をソートしやすく、国際的にも扱いやすい形式です。

4-4. 日本語形式の日付に変換する

日本語形式で表示したい場合は、次のように書きます。

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

string text = date.ToString("yyyy年MM月dd日");

Console.WriteLine(text);

出力例です。

2026年06月15日

曜日も表示する場合は、dddddddを使います。

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

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

日本語の曜日名を確実に表示したい場合は、カルチャを指定します。

C#
using System.Globalization;

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

string text = date.ToString("yyyy年MM月dd日(ddd)", culture);

Console.WriteLine(text);

4-5. 時刻を含むフォーマットに変換する

時刻を含めたい場合は、HHmmssを使います。

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

Console.WriteLine(dateTime.ToString("yyyy-MM-dd HH:mm:ss"));

出力例です。

2026-06-15 09:05:03

12時間表記にしたい場合は、hhttを使います。

C#
using System.Globalization;

DateTime dateTime = new DateTime(2026, 6, 15, 21, 5, 3);
CultureInfo culture = new CultureInfo("ja-JP");

Console.WriteLine(dateTime.ToString("yyyy-MM-dd tt hh:mm:ss", culture));

4-6. カルチャを指定して日付を変換する

カルチャを指定すると、国や言語に応じた日付表現を制御できます。

C#
using System.Globalization;

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

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

出力例です。

2026年6月15日月曜日
Monday, June 15, 2026

多言語対応のアプリケーションでは、CultureInfoを指定して日付を表示するのが重要です。

4-7. よく使うDateTimeフォーマット一覧

よく使うフォーマットは次のとおりです。

フォーマット出力例
yyyy/MM/dd2026/06/15
yyyy-MM-dd2026-06-15
yyyyMMdd20260615
yyyy年MM月dd日2026年06月15日
HH:mm:ss09:05:03
yyyy-MM-dd HH:mm:ss2026-06-15 09:05:03
yyyyMMddHHmmss20260615090503
yyyyMMdd_HHmmss20260615_090503

サンプルです。

C#
DateTime now = DateTime.Now;

Console.WriteLine(now.ToString("yyyy/MM/dd"));
Console.WriteLine(now.ToString("yyyy-MM-dd"));
Console.WriteLine(now.ToString("yyyyMMdd"));
Console.WriteLine(now.ToString("yyyy年MM月dd日"));
Console.WriteLine(now.ToString("yyyy-MM-dd HH:mm:ss"));
Console.WriteLine(now.ToString("yyyyMMdd_HHmmss"));

5. 文字列とDateTimeの変換方法

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

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

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

DateTime date = DateTime.Parse(text);

Console.WriteLine(date);

Parseは変換に失敗すると例外を投げます。

C#
string text = "invalid date";

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

入力値が必ず正しいと分かっている場合は使えますが、ユーザー入力や外部データには注意が必要です。

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

例外を避けて安全に変換したい場合は、DateTime.TryParseを使います。

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

bool success = DateTime.TryParse(text, out DateTime date);

if (success)
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("日付に変換できませんでした。");
}

変換できない場合でも例外が発生せず、falseが返ります。

C#
string text = "abc";

if (DateTime.TryParse(text, out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("不正な日付です。");
}

実務では、ParseよりTryParseを使う場面が多いです。

5-3. ParseExactで指定フォーマットの文字列を変換する

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

C#
using System.Globalization;

string text = "20260615";

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

Console.WriteLine(date);

yyyyMMdd形式の文字列だけを受け付けたい場合に便利です。

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

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

形式が一致しない場合は例外が発生します。

5-4. TryParseExactで例外を避けて変換する

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

C#
using System.Globalization;

string text = "20260615";

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

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

外部ファイル、CSV、API、フォーム入力など、形式が決まっているデータを扱う場合に適しています。

5-5. 変換できない文字列への対処法

文字列をDateTimeに変換できない原因には、次のようなものがあります。

原因
存在しない日付2026-02-30
形式が違う2026/06/15yyyy-MM-ddで変換
空文字""
nullnull
文化圏の違い06/15/202615/06/2026

安全に処理するには、次のように書きます。

C#
using System.Globalization;

string? input = "2026-06-15";

if (string.IsNullOrWhiteSpace(input))
{
Console.WriteLine("日付が入力されていません。");
}
else if (DateTime.TryParseExact(
input,
"yyyy-MM-dd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
Console.WriteLine($"変換成功: {date}");
}
else
{
Console.WriteLine("日付の形式が正しくありません。");
}

ユーザー入力を扱う場合は、TryParseまたはTryParseExactを使って、エラーメッセージを返す実装にすると安全です。

6. C# DateTimeの日付計算

6-1. 日付に日数を加算・減算する

日付に日数を加算するには、AddDaysを使います。

C#
DateTime today = DateTime.Today;

DateTime tomorrow = today.AddDays(1);
DateTime nextWeek = today.AddDays(7);

Console.WriteLine(tomorrow);
Console.WriteLine(nextWeek);

減算したい場合は、マイナスの値を指定します。

C#
DateTime yesterday = today.AddDays(-1);
DateTime lastWeek = today.AddDays(-7);

Console.WriteLine(yesterday);
Console.WriteLine(lastWeek);

6-2. 月数や年数を加算・減算する

月を加算するには、AddMonthsを使います。

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

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

Console.WriteLine(nextMonth);
Console.WriteLine(previousMonth);

年を加算するには、AddYearsを使います。

C#
DateTime nextYear = date.AddYears(1);
DateTime previousYear = date.AddYears(-1);

Console.WriteLine(nextYear);
Console.WriteLine(previousYear);

月末付近の日付では、加算後の月に同じ日が存在しない場合、自動的に調整されます。

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

DateTime result = date.AddMonths(1);

Console.WriteLine(result);

出力例です。

2026/02/28 0:00:00

6-3. 2つの日付の差分を取得する

2つのDateTimeの差分は、引き算で取得できます。

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

TimeSpan diff = end - start;

Console.WriteLine(diff.Days);

出力例です。

14

差分はTimeSpanとして返ります。

C#
Console.WriteLine(diff.TotalDays);
Console.WriteLine(diff.TotalHours);
Console.WriteLine(diff.TotalMinutes);

6-4. 経過日数・経過時間を計算する

ある日時から現在までの経過時間を計算するには、次のように書きます。

C#
DateTime createdAt = new DateTime(2026, 6, 1, 10, 0, 0);
DateTime now = DateTime.Now;

TimeSpan elapsed = now - createdAt;

Console.WriteLine($"経過日数: {elapsed.TotalDays}");
Console.WriteLine($"経過時間: {elapsed.TotalHours}");

整数の日数だけが必要な場合は、Daysを使います。

C#
Console.WriteLine(elapsed.Days);

小数を含む総日数が必要な場合は、TotalDaysを使います。

C#
Console.WriteLine(elapsed.TotalDays);

6-5. 月初・月末の日付を取得する

月初の日付を取得するには、年と月を使って1日を作成します。

C#
DateTime date = DateTime.Today;

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

Console.WriteLine(firstDay);

月末の日付を取得するには、DateTime.DaysInMonthを使います。

C#
DateTime date = DateTime.Today;

int lastDay = DateTime.DaysInMonth(date.Year, date.Month);
DateTime lastDate = new DateTime(date.Year, date.Month, lastDay);

Console.WriteLine(lastDate);

翌月の月初から1日引く方法もよく使われます。

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

Console.WriteLine(lastDate);

6-6. 翌日・前日・翌月・前年を取得する

よく使う日付計算は次のように書けます。

C#
DateTime today = DateTime.Today;

DateTime tomorrow = today.AddDays(1);
DateTime yesterday = today.AddDays(-1);
DateTime nextMonth = today.AddMonths(1);
DateTime previousMonth = today.AddMonths(-1);
DateTime nextYear = today.AddYears(1);
DateTime previousYear = today.AddYears(-1);

Console.WriteLine(tomorrow);
Console.WriteLine(yesterday);
Console.WriteLine(nextMonth);
Console.WriteLine(previousMonth);
Console.WriteLine(nextYear);
Console.WriteLine(previousYear);

日付計算では、直接DayMonthを足し算するのではなく、AddDaysAddMonthsAddYearsを使うのが安全です。

7. C# DateTimeの日付比較

7-1. 2つの日付が同じか比較する

2つのDateTimeが同じかどうかは、==で比較できます。

C#
DateTime a = new DateTime(2026, 6, 15);
DateTime b = new DateTime(2026, 6, 15);

Console.WriteLine(a == b); // True

ただし、DateTimeは日付だけでなく時刻も含めて比較します。

C#
DateTime a = new DateTime(2026, 6, 15, 10, 0, 0);
DateTime b = new DateTime(2026, 6, 15, 0, 0, 0);

Console.WriteLine(a == b); // False

日付だけを比較したい場合は、Dateを使います。

C#
Console.WriteLine(a.Date == b.Date); // True

7-2. 日付の大小を比較する

日付の前後関係は、比較演算子で判定できます。

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

Console.WriteLine(start < end); // True
Console.WriteLine(start > end); // False
Console.WriteLine(start <= end); // True
Console.WriteLine(start >= end); // False

期限切れ判定では、次のように書けます。

C#
DateTime dueDate = new DateTime(2026, 6, 10);
DateTime today = DateTime.Today;

if (dueDate < today)
{
Console.WriteLine("期限切れです。");
}

7-3. CompareTo・Compareの使い方

CompareToを使うと、比較結果を整数で取得できます。

C#
DateTime a = new DateTime(2026, 6, 1);
DateTime b = new DateTime(2026, 6, 15);

int result = a.CompareTo(b);

Console.WriteLine(result);

結果の意味は次のとおりです。

結果意味
0未満左の日付が前
0同じ
0より大きい左の日付が後

DateTime.Compareも同じように使えます。

C#
int result = DateTime.Compare(a, b);

if (result < 0)
{
Console.WriteLine("aはbより前です。");
}
else if (result == 0)
{
Console.WriteLine("aとbは同じです。");
}
else
{
Console.WriteLine("aはbより後です。");
}

7-4. 日付のみで比較する方法

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

C#
DateTime a = new DateTime(2026, 6, 15, 10, 30, 0);
DateTime b = new DateTime(2026, 6, 15, 23, 59, 59);

if (a.Date == b.Date)
{
Console.WriteLine("同じ日付です。");
}

今日かどうかを判定する場合は、次のように書けます。

C#
DateTime target = new DateTime(2026, 6, 15, 18, 0, 0);

if (target.Date == DateTime.Today)
{
Console.WriteLine("今日です。");
}

DateOnlyを使える環境であれば、日付のみの比較はさらに明確になります。

C#
DateOnly a = new DateOnly(2026, 6, 15);
DateOnly b = new DateOnly(2026, 6, 15);

Console.WriteLine(a == b); // True

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

指定した日付が期間内かどうかを判定するには、開始日以上かつ終了日以下で比較します。

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

bool isInRange = start <= target && target <= end;

Console.WriteLine(isInRange);

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

C#
bool isInRange = start.Date <= target.Date && target.Date <= end.Date;

終了日を含めたくない場合は、<を使います。

C#
bool isInRange = start <= target && target < end;

7-6. null許容DateTimeを比較する場合の注意点

DateTime?はnullを許容する日付型です。

C#
DateTime? date = null;

そのまま比較しようとすると、nullの考慮が必要です。

C#
DateTime? dueDate = new DateTime(2026, 6, 30);

if (dueDate.HasValue && dueDate.Value < DateTime.Today)
{
Console.WriteLine("期限切れです。");
}

C#では、DateTime?DateTimeの比較は書ける場合もありますが、結果がbool?になるケースがあるため、実務ではHasValueで明示的に確認すると分かりやすくなります。

C#
DateTime? targetDate = null;

if (targetDate.HasValue)
{
Console.WriteLine(targetDate.Value.ToString("yyyy-MM-dd"));
}
else
{
Console.WriteLine("日付が設定されていません。");
}

8. DateOnlyとTimeOnlyの使い方

8-1. DateOnlyとは

DateOnlyは、日付のみを表す型です。時、分、秒を持ちません。

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

Console.WriteLine(date);

生年月日、記念日、予約日、締切日、営業日など、「時刻が意味を持たない日付」を扱う場合に向いています。

DateTimeで日付だけを扱おうとすると、実際には00:00:00という時刻が含まれます。DateOnlyを使うと、時刻が混ざることによる比較ミスを防ぎやすくなります。

8-2. DateOnlyで日付のみを作成する

DateOnlyは、年、月、日を指定して作成します。

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

Console.WriteLine(date);

現在の日付から作成するには、DateOnly.FromDateTimeを使います。

C#
DateOnly today = DateOnly.FromDateTime(DateTime.Now);

Console.WriteLine(today);

文字列に変換する場合は、ToStringを使えます。

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

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

Console.WriteLine(text);

8-3. 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, 15);
TimeOnly timeOnly = new TimeOnly(9, 30);

DateTime dateTime = dateOnly.ToDateTime(timeOnly);

Console.WriteLine(dateTime);

DateOnly.ToDateTimeは、指定したTimeOnlyの時刻を組み合わせたDateTimeを返します。Microsoft Learn

時刻を00:00:00にしたい場合は、TimeOnly.MinValueを使えます。

C#
DateTime dateTime = dateOnly.ToDateTime(TimeOnly.MinValue);

8-4. TimeOnlyで時刻のみを扱う

TimeOnlyは、時刻のみを表す型です。

C#
TimeOnly time = new TimeOnly(9, 30, 0);

Console.WriteLine(time);

営業時間、開始時刻、終了時刻、アラーム時刻など、日付が不要な時刻を扱う場合に便利です。

C#
TimeOnly start = new TimeOnly(9, 0);
TimeOnly end = new TimeOnly(18, 0);
TimeOnly now = TimeOnly.FromDateTime(DateTime.Now);

if (start <= now && now <= end)
{
Console.WriteLine("営業時間内です。");
}

8-5. DateTime・DateOnly・TimeOnlyの使い分け

それぞれの使い分けは次のように考えると分かりやすいです。

使う場面
DateTime日付と時刻をまとめて扱いたい
DateOnly日付だけを扱いたい
TimeOnly時刻だけを扱いたい
DateTimeOffsetUTCオフセットを含めて日時を扱いたい

たとえば、注文日時やログ出力日時はDateTimeが向いています。

C#
DateTime orderedAt = DateTime.Now;

生年月日はDateOnlyが向いています。

C#
DateOnly birthDate = new DateOnly(1995, 4, 10);

営業時間はTimeOnlyが向いています。

C#
TimeOnly openingTime = new TimeOnly(9, 0);

グローバルな日時を扱う場合は、DateTimeOffsetも検討します。

C#
DateTimeOffset createdAt = DateTimeOffset.UtcNow;

8-6. DateOnlyを使うメリットと注意点

DateOnlyを使うメリットは、日付だけを明確に表現できることです。

C#
DateOnly birthday = new DateOnly(1995, 4, 10);

DateTimeで生年月日を表すと、実際には時刻00:00:00が含まれます。

C#
DateTime birthday = new DateTime(1995, 4, 10);

この時刻部分が、比較やシリアライズで意図しない影響を与えることがあります。

一方で、注意点もあります。古い.NET環境ではDateOnlyが使えません。また、使用しているORMやJSONシリアライザー、データベースプロバイダーによっては追加設定が必要になることがあります。

既存システムではDateTime、新規開発で日付のみの意味が明確な項目ではDateOnlyを検討するとよいでしょう。

9. DateTimeでよくあるエラーと注意点

9-1. DateTime.NowとDateTime.UtcNowの違い

DateTime.Nowはローカル時刻を返します。

C#
DateTime localNow = DateTime.Now;

DateTime.UtcNowはUTC時刻を返します。

C#
DateTime utcNow = DateTime.UtcNow;

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

C#
Console.WriteLine(DateTime.Now);
Console.WriteLine(DateTime.UtcNow);

ローカルの画面表示にはDateTime.Now、システム間連携や保存にはDateTime.UtcNowを使うことが多いです。

ただし、UTCで保存した日時を画面に表示する場合は、ローカル時刻に変換する必要があります。

C#
DateTime utc = DateTime.UtcNow;
DateTime local = utc.ToLocalTime();

Console.WriteLine(local);

9-2. タイムゾーンを考慮する場合の注意点

タイムゾーンを考慮する場合、単純にDateTimeだけで処理すると誤差が出ることがあります。

C#
DateTime utcNow = DateTime.UtcNow;

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

DateTime tokyoTime = TimeZoneInfo.ConvertTimeFromUtc(utcNow, tokyoTimeZone);

Console.WriteLine(tokyoTime);

サーバーが日本以外のタイムゾーンで動作している場合、DateTime.Nowの結果が想定と違うことがあります。

グローバル対応が必要なシステムでは、次の方針を検討します。

場面推奨例
DB保存UTCで保存
画面表示ユーザーのタイムゾーンに変換
API連携ISO 8601形式やUTCを使う
オフセット保持DateTimeOffsetを使う

9-3. DateTimeKindの意味と使い方

DateTimeにはKindプロパティがあります。

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

Console.WriteLine(local.Kind);
Console.WriteLine(utc.Kind);
Console.WriteLine(unspecified.Kind);

主な値は次の3つです。

意味
Localローカル時刻
UtcUTC時刻
Unspecifiedどちらとも指定されていない

new DateTime(2026, 6, 15)のように作成した場合、通常はUnspecifiedになります。

明示的に指定することもできます。

C#
DateTime utcDateTime = new DateTime(
2026, 6, 15, 0, 0, 0,
DateTimeKind.Utc
);

Console.WriteLine(utcDateTime.Kind);

タイムゾーン変換を行う場合は、Kindの違いに注意しましょう。

9-4. 文字列変換で発生しやすい例外

DateTime.ParseParseExactでは、変換できない文字列を渡すとFormatExceptionが発生します。

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

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

実務では、ユーザー入力や外部データをそのままParseするのは危険です。

C#
if (DateTime.TryParse(text, out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("日付形式が不正です。");
}

形式が決まっている場合は、TryParseExactを使います。

C#
using System.Globalization;

string text = "2026-06-15";

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

9-5. 日付比較で時刻が影響するケース

日付だけを比較したいのに、時刻が影響してしまうケースはよくあります。

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

Console.WriteLine(today == now); // 多くの場合 False

today00:00:00nowは現在時刻を持つためです。

日付だけで比較する場合は、必ずDateを使います。

C#
Console.WriteLine(today.Date == now.Date); // True

期限判定でも注意が必要です。

C#
DateTime dueDate = new DateTime(2026, 6, 15);
DateTime now = new DateTime(2026, 6, 15, 12, 0, 0);

Console.WriteLine(dueDate < now); // True

同じ日付なのに、時刻の差で期限切れと判定される可能性があります。

日付単位で期限を判定するなら、次のように書きます。

C#
bool isExpired = dueDate.Date < now.Date;

9-6. データベース保存時の日付形式に注意する

データベースに日時を保存する場合、文字列ではなく日時型のカラムに保存するのが基本です。

C#
DateTime createdAt = DateTime.UtcNow;

SQL Serverであればdatetime2、PostgreSQLであればtimestamptimestamptzなど、用途に合った型を使います。

文字列で保存すると、ソートや検索、タイムゾーン変換、日付計算が難しくなることがあります。

C#
// 推奨されにくい例
string createdAt = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");

保存時はUTC、表示時はローカル時刻へ変換する設計にすると、サーバー環境やユーザーの地域に左右されにくくなります。

C#
DateTime savedUtc = DateTime.UtcNow;
DateTime displayLocal = savedUtc.ToLocalTime();

10. 実務で使えるDateTimeサンプルコード集

10-1. 今日の日付をyyyyMMdd形式で取得する

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

Console.WriteLine(today);

出力例です。

20260615

ファイル名、連番、ログ、バッチ処理などでよく使います。

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

Console.WriteLine(fileName);

10-2. 生年月日から年齢を計算する

DateTimeで年齢を計算する例です。

C#
DateTime birthDate = new DateTime(1995, 4, 10);
DateTime today = DateTime.Today;

int age = today.Year - birthDate.Year;

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

Console.WriteLine(age);

誕生日がまだ来ていない場合は、1歳引く必要があります。

DateOnlyを使う場合は次のように書けます。

C#
DateOnly birthDate = new DateOnly(1995, 4, 10);
DateOnly today = DateOnly.FromDateTime(DateTime.Today);

int age = today.Year - birthDate.Year;

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

Console.WriteLine(age);

10-3. 指定日が土日か判定する

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

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

Console.WriteLine(isWeekend);

メソッド化すると再利用しやすくなります。

C#
static bool IsWeekend(DateTime date)
{
return date.DayOfWeek == DayOfWeek.Saturday ||
date.DayOfWeek == DayOfWeek.Sunday;
}

使い方です。

C#
if (IsWeekend(DateTime.Today))
{
Console.WriteLine("土日です。");
}

10-4. 営業日を判定する

土日を除いた営業日判定の例です。

C#
static bool IsBusinessDay(DateTime date)
{
return date.DayOfWeek != DayOfWeek.Saturday &&
date.DayOfWeek != DayOfWeek.Sunday;
}

DateTime date = DateTime.Today;

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

祝日も考慮する場合は、祝日リストを用意します。

C#
static bool IsBusinessDay(DateTime date, HashSet<DateTime> holidays)
{
if (date.DayOfWeek == DayOfWeek.Saturday ||
date.DayOfWeek == DayOfWeek.Sunday)
{
return false;
}

if (holidays.Contains(date.Date))
{
return false;
}

return true;
}

使い方です。

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

bool result = IsBusinessDay(DateTime.Today, holidays);

Console.WriteLine(result);

10-5. 期限切れかどうかを判定する

日時単位で期限切れを判定する例です。

C#
DateTime deadline = new DateTime(2026, 6, 15, 18, 0, 0);

bool isExpired = DateTime.Now > deadline;

Console.WriteLine(isExpired);

日付単位で判定する場合は、Dateを使います。

C#
DateTime deadline = new DateTime(2026, 6, 15);

bool isExpired = DateTime.Today > deadline.Date;

Console.WriteLine(isExpired);

「期限日当日までは有効」としたい場合は、次のように書きます。

C#
bool isExpired = DateTime.Today > deadline.Date;

「期限日になった時点で期限切れ」としたい場合は、次のように書きます。

C#
bool isExpired = DateTime.Today >= deadline.Date;

10-6. ログ出力用の日時文字列を作成する

ログ出力では、日時を固定形式にしておくと検索しやすくなります。

C#
string logTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");

Console.WriteLine(logTime);

出力例です。

2026-06-15 09:05:03.123

ログメッセージに組み込む例です。

C#
string message = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}] 処理を開始しました。";

Console.WriteLine(message);

UTCでログを残す場合は、次のように書きます。

C#
string logTime = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff");

Console.WriteLine(logTime);

10-7. ファイル名に使える日時文字列を作成する

ファイル名に日時を含める場合は、/:を使わない形式にします。

C#
string timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss");

string fileName = $"backup_{timestamp}.zip";

Console.WriteLine(fileName);

出力例です。

backup_20260615_090503.zip

ミリ秒まで含めたい場合は、次のようにします。

C#
string timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss_fff");

string fileName = $"log_{timestamp}.txt";

Console.WriteLine(fileName);

複数ファイルを短時間で作成する場合は、ミリ秒やGUIDを組み合わせると重複を避けやすくなります。

C#
string fileName = $"export_{DateTime.Now:yyyyMMdd_HHmmss_fff}_{Guid.NewGuid():N}.csv";

Console.WriteLine(fileName);

11. C# DateTimeに関するよくある質問

11-1. C#で今日の日付だけを取得するには?

今日の日付だけを取得するには、DateTime.Todayを使います。

C#
DateTime today = DateTime.Today;

Console.WriteLine(today);

文字列として日付だけを表示するなら、ToStringでフォーマットを指定します。

C#
string todayText = DateTime.Today.ToString("yyyy-MM-dd");

Console.WriteLine(todayText);

.NET 6以降で日付のみを型として扱いたい場合は、DateOnlyも使えます。

C#
DateOnly today = DateOnly.FromDateTime(DateTime.Today);

Console.WriteLine(today);

11-2. DateTimeから時刻を削除するには?

DateTimeから時刻部分を取り除くには、Dateプロパティを使います。

C#
DateTime now = DateTime.Now;

DateTime dateOnly = now.Date;

Console.WriteLine(dateOnly);

ただし、DateTime型である以上、時刻00:00:00は保持されます。

2026/06/15 0:00:00

本当に日付だけを扱いたい場合は、DateOnlyを使うのも選択肢です。

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

11-3. DateTimeをyyyy-MM-dd形式にするには?

ToString("yyyy-MM-dd")を使います。

C#
DateTime date = DateTime.Now;

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

Console.WriteLine(text);

出力例です。

2026-06-15

時刻も含める場合は、次のように書きます。

C#
string text = date.ToString("yyyy-MM-dd HH:mm:ss");

11-4. 文字列をDateTimeに変換するには?

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

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

DateTime date = DateTime.Parse(text);

安全に変換するなら、TryParseがおすすめです。

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

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

形式が決まっている場合は、TryParseExactを使います。

C#
using System.Globalization;

string text = "2026-06-15";

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

11-5. DateTime同士を日付だけで比較するには?

日付だけで比較するには、Dateプロパティを使います。

C#
DateTime a = new DateTime(2026, 6, 15, 10, 0, 0);
DateTime b = new DateTime(2026, 6, 15, 20, 0, 0);

bool sameDate = a.Date == b.Date;

Console.WriteLine(sameDate);

出力はTrueです。

True

DateTime同士をそのまま比較すると、時刻まで比較されるため注意しましょう。

C#
Console.WriteLine(a == b); // False

11-6. DateTimeとDateOnlyはどちらを使うべき?

日付と時刻をまとめて扱うなら、DateTimeを使います。

C#
DateTime createdAt = DateTime.Now;

日付だけを扱うなら、DateOnlyを使うと意図が明確になります。

C#
DateOnly birthDate = new DateOnly(1995, 4, 10);

使い分けの目安は次のとおりです。

用途おすすめの型
作成日時DateTime
更新日時DateTime
ログ日時DateTime
生年月日DateOnly
記念日DateOnly
営業日DateOnly
開始時刻TimeOnly
タイムゾーンを含む日時DateTimeOffset

既存システムや古い.NET環境ではDateTimeを使うことが多いですが、新規開発で日付だけの項目を扱うならDateOnlyも検討するとよいでしょう。

まとめ

C#で日付や時刻を扱う基本の型はDateTimeです。現在日時の取得、今日の日付の取得、任意の日付作成、フォーマット変換、文字列変換、日付計算、比較など、幅広い処理に対応できます。

現在日時を取得する場合は、ローカル時刻ならDateTime.Now、UTCならDateTime.UtcNowを使います。

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

今日の日付だけを取得するなら、DateTime.Todayがシンプルです。

C#
DateTime today = DateTime.Today;

表示形式を変えたい場合は、ToStringでフォーマットを指定します。

C#
string text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

文字列から日付に変換する場合は、例外を避けるためにTryParseTryParseExactを使うと安全です。

C#
bool success = DateTime.TryParse("2026-06-15", out DateTime date);

日付だけで比較したい場合は、時刻の影響を避けるためにDateプロパティを使います。

C#
bool sameDate = date1.Date == date2.Date;

.NET 6以降では、日付のみを扱うDateOnly、時刻のみを扱うTimeOnlyも利用できます。生年月日や営業日など時刻が不要なデータでは、DateOnlyを使うことでコードの意図が分かりやすくなります。

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

DateTimeは便利な一方で、時刻、タイムゾーン、DateTimeKind、文字列変換、日付比較でミスが起きやすい型でもあります。日付のみなのか、日時なのか、UTCなのか、ローカル時刻なのかを意識して使い分けることが、C#で日付処理を正しく実装するポイントです。