C#の日付操作を完全解説|DateTimeの取得・比較・変換・フォーマット方法

はじめに

C#で日付を扱う場面は非常に多くあります。たとえば、現在日時の取得、期限日の判定、日付の比較、文字列から日付への変換、ログやファイル名への日付付与、データベース保存用のフォーマット変換などです。

C#では主にDateTimeを使って日付と時刻を扱います。また、.NET 6以降では日付のみを扱うDateOnly、時刻のみを扱うTimeOnlyも利用できます。

この記事では、C#の日付操作について、DateTimeの基本から、取得・比較・計算・変換・フォーマット指定・実務でよく使う処理まで、サンプルコード付きでわかりやすく解説します。

1. C#の日付操作でまず押さえるべき基本

1-1. C#で日付を扱う代表的な型:DateTimeとは

C#で日付や時刻を扱う代表的な型がDateTimeです。

DateTimeは、年・月・日・時・分・秒・ミリ秒などをまとめて保持できる構造体です。

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

Console.WriteLine(date);

実行結果の例です。

C#
2026/06/11 0:00:00

DateTimeは「日付」と「時刻」の両方を持つ点が特徴です。そのため、日付だけを扱いたい場合でも、内部的には時刻として00:00:00が含まれます。

1-2. DateTimeで扱える日付・時刻の範囲

DateTimeで扱える最小値と最大値は、DateTime.MinValueDateTime.MaxValueで確認できます。

C#
Console.WriteLine(DateTime.MinValue);
Console.WriteLine(DateTime.MaxValue);

出力例です。

C#
0001/01/01 0:00:00
9999/12/31 23:59:59

通常の業務アプリケーションでは十分な範囲ですが、データベースと連携する場合は注意が必要です。たとえばSQL Serverのdatetime型では扱える日付範囲が異なるため、DateTime.MinValueをそのまま保存しようとするとエラーになることがあります。

1-3. 日付のみ・時刻のみを扱いたい場合の考え方

DateTimeは日付と時刻を同時に扱う型です。

そのため、日付のみを扱いたい場合は、時刻を00:00:00として扱うことが一般的です。

C#
DateTime today = DateTime.Today;

Console.WriteLine(today);
C#
2026/06/11 0:00:00

時刻のみを扱いたい場合は、DateTimeTimeOfDayプロパティを使うと、TimeSpanとして時刻部分を取得できます。

C#
DateTime now = DateTime.Now;
TimeSpan time = now.TimeOfDay;

Console.WriteLine(time);

.NET 6以降であれば、日付のみを表すDateOnly、時刻のみを表すTimeOnlyを使う選択肢もあります。

1-4. DateTimeとDateOnly・TimeOnlyの違い

DateTimeDateOnlyTimeOnlyの違いは次のとおりです。

扱う内容主な用途
DateTime日付と時刻作成日時、更新日時、予約日時、ログ日時
DateOnly日付のみ生年月日、締切日、営業日、記念日
TimeOnly時刻のみ開始時刻、終了時刻、営業時間

たとえば、誕生日のように時刻が不要なデータではDateOnlyが向いています。

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

一方、ログの記録時刻や予約日時のように「いつ発生したか」を正確に扱う場合はDateTimeDateTimeOffsetを使うことが多いです。

2. C#で現在の日付・時刻を取得する方法

2-1. 現在日時を取得する:DateTime.Now

C#で現在のローカル日時を取得するには、DateTime.Nowを使います。

C#
DateTime now = DateTime.Now;

Console.WriteLine(now);

出力例です。

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

DateTime.Nowは、実行環境のローカルタイムゾーンに基づいた現在日時を返します。

画面表示やユーザー向けの日時表示ではよく使われますが、サーバー処理やデータ保存ではタイムゾーンに注意が必要です。

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

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

C#
DateTime today = DateTime.Today;

Console.WriteLine(today);

出力例です。

C#
2026/06/11 0:00:00

DateTime.Todayは、現在日の00:00:00を返します。

「今日より前かどうか」「本日分のデータかどうか」を判定する場合に便利です。

C#
DateTime targetDate = new DateTime(2026, 6, 10);

if (targetDate < DateTime.Today)
{
Console.WriteLine("過去の日付です");
}

2-3. UTC時刻を取得する:DateTime.UtcNow

UTC時刻を取得するには、DateTime.UtcNowを使います。

C#
DateTime utcNow = DateTime.UtcNow;

Console.WriteLine(utcNow);

UTCは協定世界時です。サーバー側で日時を保存する場合、ローカル時刻ではなくUTCで保存すると、タイムゾーンの違いによる混乱を減らせます。

C#
DateTime createdAt = DateTime.UtcNow;

グローバル向けのシステム、API、ログ、データベース保存では、UTCを基準にする設計がよく使われます。

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 date = DateTime.Now;

Console.WriteLine($"{date.Year}年{date.Month}月{date.Day}日");

2-5. 曜日を取得する:DayOfWeek

曜日を取得するには、DayOfWeekプロパティを使います。

C#
DateTime date = DateTime.Today;
DayOfWeek dayOfWeek = date.DayOfWeek;

Console.WriteLine(dayOfWeek);

出力例です。

C#
Thursday

DayOfWeekは列挙型で、次の値を持ちます。

意味
Sunday日曜日
Monday月曜日
Tuesday火曜日
Wednesday水曜日
Thursday木曜日
Friday金曜日
Saturday土曜日

土日判定は次のように書けます。

C#
DateTime date = DateTime.Today;

if (date.DayOfWeek == DayOfWeek.Saturday ||
date.DayOfWeek == DayOfWeek.Sunday)
{
Console.WriteLine("休日です");
}
else
{
Console.WriteLine("平日です");
}

3. C#で任意の日付を作成する方法

3-1. new DateTimeで日付を指定して作成する

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

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

Console.WriteLine(date);

このコードでは、2026年6月11日のDateTimeを作成しています。

時刻を指定しない場合、時刻は00:00:00になります。

C#
2026/06/11 0:00:00

3-2. 年月日と時分秒を指定して作成する

年月日だけでなく、時分秒も指定できます。

C#
DateTime dateTime = new DateTime(2026, 6, 11, 15, 30, 45);

Console.WriteLine(dateTime);

出力例です。

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

予約日時、開始日時、終了日時などを明示的に作成したい場合に使います。

C#
DateTime meetingStart = new DateTime(2026, 6, 11, 10, 0, 0);
DateTime meetingEnd = new DateTime(2026, 6, 11, 11, 0, 0);

3-3. DateTimeKindでローカル時刻・UTCを指定する

DateTimeには、日時の種類を表すKindプロパティがあります。

代表的な値は次の3つです。

意味
DateTimeKind.Localローカル時刻
DateTimeKind.UtcUTC時刻
DateTimeKind.Unspecified指定なし

作成時にDateTimeKindを指定できます。

C#
DateTime localTime = new DateTime(
2026, 6, 11, 15, 30, 0, DateTimeKind.Local);

DateTime utcTime = new DateTime(
2026, 6, 11, 6, 30, 0, DateTimeKind.Utc);

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

出力例です。

C#
Local
Utc

ただし、DateTimeKindはタイムゾーンそのものを保持するわけではありません。日本時間、米国東部時間、欧州時間などの具体的なタイムゾーン情報を扱いたい場合は、DateTimeOffsetTimeZoneInfoの利用も検討します。

3-4. 不正な日付を作成したときのエラーに注意する

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

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

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

月や日の値が不正な場合も同様です。

C#
DateTime invalidMonth = new DateTime(2026, 13, 1);
DateTime invalidDay = new DateTime(2026, 4, 31);

ユーザー入力から日付を作成する場合は、いきなりnew DateTimeParseを使うのではなく、入力チェックやTryParseを使って安全に処理することが重要です。

4. C#で日付を比較する方法

4-1. 日付・時刻を比較する基本

DateTimeは、日付と時刻を含めて比較されます。

たとえば、同じ日付でも時刻が異なれば別の値として扱われます。

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

Console.WriteLine(date1 == date2);

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

C#
False

日付だけを比較したいのか、時刻まで含めて比較したいのかを明確にすることが大切です。

4-2. DateTime同士を==・>・<で比較する

DateTime同士は、==!=><>=<=で比較できます。

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

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

期限切れ判定も簡単に書けます。

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

if (deadline < DateTime.Today)
{
Console.WriteLine("期限切れです");
}

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

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

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

int result = date1.CompareTo(date2);

Console.WriteLine(result);

CompareToの戻り値は次の意味を持ちます。

戻り値意味
0より小さい呼び出し元の日付が比較対象より前
0同じ日時
0より大きい呼び出し元の日付が比較対象より後

次のように条件分岐できます。

C#
if (date1.CompareTo(date2) < 0)
{
Console.WriteLine("date1はdate2より前です");
}

通常は><のほうが読みやすいですが、並び替え処理や比較ロジックを明示したい場合にはCompareToも使えます。

4-4. 日付のみを比較する:Dateプロパティの使い方

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

C#
DateTime date1 = new DateTime(2026, 6, 11, 10, 0, 0);
DateTime date2 = new DateTime(2026, 6, 11, 18, 30, 0);

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

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

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

Console.WriteLine(dateOnly);

4-5. 今日より前・今日以降・期限切れを判定する

実務では、今日を基準にした判定がよく使われます。

C#
DateTime targetDate = new DateTime(2026, 6, 10);

if (targetDate.Date < DateTime.Today)
{
Console.WriteLine("今日より前です");
}

今日以降かどうかを判定する例です。

C#
if (targetDate.Date >= DateTime.Today)
{
Console.WriteLine("今日以降です");
}

期限切れ判定の例です。

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

bool isExpired = dueDate.Date < DateTime.Today;

Console.WriteLine(isExpired);

日付だけで比較する場合は、比較対象にも.Dateを付けると意図が明確になります。

C#
if (dueDate.Date < DateTime.Today)
{
Console.WriteLine("期限切れです");
}

5. C#で日付を計算する方法

5-1. 日付に日数を足す・引く:AddDays

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

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

Console.WriteLine(tomorrow);

日数を引く場合は、マイナス値を指定します。

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

Console.WriteLine(yesterday);

7日後を求める例です。

C#
DateTime nextWeek = DateTime.Today.AddDays(7);

5-2. 月を加算・減算する:AddMonths

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

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

Console.WriteLine(nextMonth);

前月を取得する場合は、マイナス値を指定します。

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

Console.WriteLine(previousMonth);

月末日に対してAddMonthsを使う場合は注意が必要です。

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

Console.WriteLine(result);

出力例です。

C#
2026/02/28 0:00:00

2月31日は存在しないため、月末日に調整されます。

5-3. 年を加算・減算する:AddYears

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

C#
DateTime date = new DateTime(2026, 6, 11);
DateTime nextYear = date.AddYears(1);

Console.WriteLine(nextYear);

前年を取得する場合は、マイナス値を指定します。

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

うるう年の日付を扱う場合は注意が必要です。

C#
DateTime leapDay = new DateTime(2024, 2, 29);
DateTime nextYear = leapDay.AddYears(1);

Console.WriteLine(nextYear);

出力例です。

C#
2025/02/28 0:00:00

2025年には2月29日が存在しないため、2月28日になります。

5-4. 時間・分・秒を加算する

時間を加算するにはAddHoursを使います。

C#
DateTime now = DateTime.Now;
DateTime afterOneHour = now.AddHours(1);

分を加算するにはAddMinutesを使います。

C#
DateTime afterThirtyMinutes = now.AddMinutes(30);

秒を加算するにはAddSecondsを使います。

C#
DateTime afterTenSeconds = now.AddSeconds(10);

ミリ秒を加算する場合はAddMillisecondsを使います。

C#
DateTime afterMilliseconds = now.AddMilliseconds(500);

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

2つのDateTimeを引き算すると、差分をTimeSpanとして取得できます。

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

TimeSpan diff = end - start;

Console.WriteLine(diff.Days);

出力例です。

C#
10

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

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

Daysは日数部分、TotalDaysは全体を日数に換算した値です。

C#
DateTime start = new DateTime(2026, 6, 1, 12, 0, 0);
DateTime end = new DateTime(2026, 6, 2, 18, 0, 0);

TimeSpan diff = end - start;

Console.WriteLine(diff.Days);
Console.WriteLine(diff.TotalDays);

この場合、Days1TotalDays1.25になります。

5-6. 経過日数・残り日数・年齢を計算する

経過日数を求める例です。

C#
DateTime startDate = new DateTime(2026, 6, 1);
int elapsedDays = (DateTime.Today - startDate).Days;

Console.WriteLine(elapsedDays);

残り日数を求める例です。

C#
DateTime dueDate = new DateTime(2026, 6, 30);
int remainingDays = (dueDate.Date - DateTime.Today).Days;

Console.WriteLine(remainingDays);

年齢を計算する場合は、単純に年を引くだけでは不十分です。誕生日を迎えているかどうかを考慮する必要があります。

C#
DateTime birthday = new DateTime(1995, 8, 20);
DateTime today = DateTime.Today;

int age = today.Year - birthday.Year;

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

Console.WriteLine(age);

このように、年齢計算では「今年の誕生日を過ぎているか」を判定するのがポイントです。

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

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

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

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

string text = date.ToString();

Console.WriteLine(text);

出力形式は実行環境のカルチャ設定によって変わる場合があります。

特定の形式で表示したい場合は、書式を指定します。

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

Console.WriteLine(text);

6-2. yyyy/MM/dd形式で表示する

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

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

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

Console.WriteLine(text);

出力結果です。

C#
2026/06/11

スラッシュ区切りの日付は、日本の業務システムでもよく使われます。

6-3. yyyy-MM-dd形式で表示する

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

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

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

Console.WriteLine(text);

出力結果です。

C#
2026-06-11

yyyy-MM-ddは、APIやデータ保存、ログなどでもよく使われる形式です。

6-4. yyyy年MM月dd日形式で表示する

日本語表記にしたい場合は、文字をそのまま書式文字列に含められます。

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

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

Console.WriteLine(text);

出力結果です。

C#
2026年06月11日

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

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

Console.WriteLine(text);

出力結果です。

C#
2026年6月11日

6-5. 時刻まで含めて表示する

時刻まで含めて表示する場合は、HHmmssを使います。

C#
DateTime dateTime = new DateTime(2026, 6, 11, 15, 30, 45);

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

Console.WriteLine(text);

出力結果です。

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

24時間表記ではHHを使います。

12時間表記ではhhを使います。

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

通常の業務システムでは、午前・午後の混乱を避けるためにHH:mm:ssの24時間表記がよく使われます。

6-6. カスタム書式指定子の一覧

よく使うカスタム書式指定子は次のとおりです。

指定子意味
yyyy4桁の年2026
yy2桁の年26
MM2桁の月06
M6
dd2桁の日11
d11
HH24時間表記の時15
H24時間表記の時15
hh12時間表記の時03
mm30
ss45
fffミリ秒123
dddd曜日木曜日
ddd短い曜日

たとえば、ミリ秒まで表示する場合は次のように書きます。

C#
DateTime now = DateTime.Now;

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

Console.WriteLine(text);

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

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

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

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

DateTime date = DateTime.Parse(text);

Console.WriteLine(date);

出力例です。

C#
2026/06/11 0:00:00

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

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

このような場合はFormatExceptionが発生します。

ユーザー入力など、正しい日付かどうかわからない値を扱う場合は、TryParseを使うほうが安全です。

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

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

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

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

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

変換に失敗しても例外が発生しないため、入力チェックに向いています。

C#
string input = "invalid date";

if (DateTime.TryParse(input, out DateTime result))
{
Console.WriteLine($"変換成功: {result}");
}
else
{
Console.WriteLine("正しい日付を入力してください");
}

7-3. ParseExactで指定形式の日付を変換する

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

C#
using System.Globalization;

string text = "20260611";

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

Console.WriteLine(date);

出力例です。

C#
2026/06/11 0:00:00

ParseExactは、指定した形式と完全に一致する場合だけ変換します。

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

C#
DateTime date = DateTime.ParseExact(
"2026/06/11",
"yyyyMMdd",
CultureInfo.InvariantCulture);

この場合はFormatExceptionが発生します。

7-4. TryParseExactで変換エラーを防ぐ

指定形式で安全に変換したい場合は、TryParseExactを使います。

C#
using System.Globalization;

string text = "20260611";

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

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

ユーザー入力や外部ファイル、CSV、APIレスポンスなどを扱う場合は、TryParseExactを使うと安全です。

複数の形式を許可したい場合は、書式の配列を指定できます。

C#
using System.Globalization;

string input = "2026-06-11";

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

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

if (success)
{
Console.WriteLine(date);
}

7-5. 変換できない日付文字列の原因と対処法

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

原因対処法
形式が違う2026-06-11に対してyyyy/MM/ddを指定入力形式と書式を合わせる
存在しない日付2026/02/30日付として妥当か確認する
余分な文字がある2026/06/11(火)不要な文字を取り除く
カルチャが合わない英語の月名などCultureInfoを指定する
空文字やnull""事前チェックを行う

安全に処理する例です。

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

if (string.IsNullOrWhiteSpace(input))
{
Console.WriteLine("日付が入力されていません");
}
else if (DateTime.TryParse(input, out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("正しい日付ではありません");
}

8. C#で日付フォーマットを指定する方法

8-1. 標準の日付と時刻の書式指定子

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

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

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"));
Console.WriteLine(now.ToString("s"));

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

指定子意味
d短い日付形式
D長い日付形式
t短い時刻形式
T長い時刻形式
f長い日付と短い時刻
F長い日付と長い時刻
g短い日付と短い時刻
G短い日付と長い時刻
s並べ替え可能な日時形式
oラウンドトリップ日時形式

標準書式はカルチャの影響を受けるものがあります。固定の表示形式が必要な場合は、カスタム書式を使うのがおすすめです。

8-2. カスタム日付フォーマットの使い方

カスタム日付フォーマットでは、yyyyMMddHHmmssなどを組み合わせます。

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

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

出力例です。

C#
2026/06/11
2026-06-11
2026年06月11日
2026/06/11 15:30:45

ファイル名に使う場合は、スラッシュやコロンを避けます。

C#
string fileName = DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".log";

Console.WriteLine(fileName);

出力例です。

C#
20260611_153045.log

8-3. ゼロ埋めあり・なしの違い

MMddのように2文字で指定すると、ゼロ埋めされます。

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

Console.WriteLine(date.ToString("yyyy/MM/dd"));
Console.WriteLine(date.ToString("yyyy/M/d"));

出力結果です。

C#
2026/06/05
2026/6/5

ゼロ埋めありの形式は、文字列として並べ替えたときにも扱いやすいです。

C#
2026/06/05
2026/06/11
2026/12/01

一方、画面表示ではゼロ埋めなしのほうが自然に見える場合もあります。

C#
2026年6月5日

用途に応じて使い分けましょう。

8-4. 曜日を日本語で表示する方法

曜日を日本語で表示するには、CultureInfoを指定します。

C#
using System.Globalization;

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

string text = date.ToString("dddd", new CultureInfo("ja-JP"));

Console.WriteLine(text);

出力結果です。

C#
木曜日

短い曜日表記にする場合はdddを使います。

C#
string shortDay = date.ToString("ddd", new CultureInfo("ja-JP"));

Console.WriteLine(shortDay);

出力結果です。

C#

日付と曜日を組み合わせる例です。

C#
string text = date.ToString("yyyy年M月d日(ddd)", new CultureInfo("ja-JP"));

Console.WriteLine(text);

出力結果です。

C#
2026年6月11日()

8-5. CultureInfoを使って表示形式を制御する

CultureInfoを使うと、国や地域ごとの日付表示を制御できます。

C#
using System.Globalization;

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

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

出力例です。

C#
2026年6月11日木曜日
Thursday, June 11, 2026
jeudi 11 juin 2026

ユーザーの言語設定に合わせた表示を行いたい場合は、CultureInfoを適切に指定します。

一方、ログやデータ連携など、環境に依存しない形式が必要な場合は、CultureInfo.InvariantCultureを使うと安定します。

C#
using System.Globalization;

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

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

Console.WriteLine(text);

9. C#で日付のみ・時刻のみを扱う方法

9-1. DateTimeから日付部分だけを取得する

DateTimeから日付部分だけを取得するには、Dateプロパティを使います。

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

DateTime dateOnly = now.Date;

Console.WriteLine(dateOnly);

出力結果です。

C#
2026/06/11 0:00:00

Dateプロパティを使うと、時刻部分は00:00:00になります。

日付のみで比較したい場合にもよく使います。

C#
if (now.Date == DateTime.Today)
{
Console.WriteLine("今日の日付です");
}

9-2. DateTimeから時刻部分だけを取得する

DateTimeから時刻部分だけを取得するには、TimeOfDayプロパティを使います。

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

TimeSpan time = now.TimeOfDay;

Console.WriteLine(time);

出力結果です。

C#
15:30:45

時刻を文字列として表示したい場合は、ToStringで書式指定します。

C#
string timeText = now.ToString("HH:mm:ss");

Console.WriteLine(timeText);

出力結果です。

C#
15:30:45

9-3. DateOnlyで日付のみを扱う

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

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

Console.WriteLine(date);

DateOnlyは時刻情報を持たないため、生年月日、締切日、営業日などに向いています。

現在日をDateOnlyで取得するには、DateTimeから変換します。

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

Console.WriteLine(today);

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

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

Console.WriteLine(text);

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

.NET 6以降では、時刻のみを扱うTimeOnlyも使えます。

C#
TimeOnly time = new TimeOnly(15, 30, 45);

Console.WriteLine(time);

現在時刻をTimeOnlyで取得するには、DateTimeから変換します。

C#
TimeOnly now = TimeOnly.FromDateTime(DateTime.Now);

Console.WriteLine(now);

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

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

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

DateTimeDateOnlyTimeOnlyは、扱いたい情報によって使い分けます。

用途おすすめの型
作成日時・更新日時DateTimeまたはDateTimeOffset
予約日時DateTimeまたはDateTimeOffset
生年月日DateOnly
締切日DateOnly
営業日DateOnly
開始時刻・終了時刻TimeOnly
営業時間TimeOnly

時刻やタイムゾーンが重要な場面では、DateTimeだけでなくDateTimeOffsetも検討します。

一方、日付だけが必要な場合にDateTimeを使うと、不要な時刻情報によって比較ミスが起きることがあります。そのような場面ではDateOnlyが便利です。

10. C#の日付操作でよくある実務パターン

10-1. 月初日・月末日を取得する

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

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

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

Console.WriteLine(firstDay);

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

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

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

Console.WriteLine(lastDate);

出力例です。

C#
2026/06/30 0:00:00

現在月の月初日と月末日を取得する例です。

C#
DateTime today = DateTime.Today;

DateTime firstDay = new DateTime(today.Year, today.Month, 1);
DateTime lastDay = new DateTime(
today.Year,
today.Month,
DateTime.DaysInMonth(today.Year, today.Month));

10-2. 翌月・前月の日付を取得する

翌月の日付を取得するにはAddMonths(1)を使います。

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

DateTime nextMonth = date.AddMonths(1);

Console.WriteLine(nextMonth);

前月の日付を取得するにはAddMonths(-1)を使います。

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

Console.WriteLine(previousMonth);

翌月の月初日を取得する例です。

C#
DateTime today = DateTime.Today;

DateTime nextMonthFirstDay = new DateTime(today.Year, today.Month, 1)
.AddMonths(1);

Console.WriteLine(nextMonthFirstDay);

前月の月末日を取得する例です。

C#
DateTime today = DateTime.Today;

DateTime previousMonthLastDay = new DateTime(today.Year, today.Month, 1)
.AddDays(-1);

Console.WriteLine(previousMonthLastDay);

10-3. 週の開始日・終了日を取得する

週の開始日を月曜日として取得する例です。

C#
DateTime today = DateTime.Today;

int diff = ((int)today.DayOfWeek - (int)DayOfWeek.Monday + 7) % 7;
DateTime startOfWeek = today.AddDays(-diff);
DateTime endOfWeek = startOfWeek.AddDays(6);

Console.WriteLine(startOfWeek);
Console.WriteLine(endOfWeek);

DayOfWeekでは日曜日が0、月曜日が1です。

週の開始日を日曜日にしたい場合は、次のように書けます。

C#
DateTime today = DateTime.Today;

int diff = (int)today.DayOfWeek;
DateTime startOfWeek = today.AddDays(-diff);
DateTime endOfWeek = startOfWeek.AddDays(6);

業務要件によって、週の開始が月曜日なのか日曜日なのかは異なります。仕様として明確にしておくことが重要です。

10-4. 営業日や休日判定の考え方

営業日判定では、まず土日を除外するのが基本です。

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

使い方です。

C#
DateTime date = DateTime.Today;

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

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

C#
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;
}

祝日は年によって変わるため、固定のロジックだけで判定するのは危険です。実務では、祝日マスタ、外部API、設定ファイルなどで管理することが多いです。

10-5. ファイル名に日付を付ける

ログファイルやバックアップファイルには、日付を付けることがよくあります。

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

Console.WriteLine(fileName);

出力例です。

C#
log_20260611.txt

時刻まで含める場合は次のようにします。

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

Console.WriteLine(fileName);

出力例です。

C#
backup_20260611_153045.zip

ファイル名では、/:などの文字は使えない場合があります。そのため、yyyy/MM/dd HH:mm:ssではなく、yyyyMMdd_HHmmssのような形式にするのが安全です。

10-6. ログやDB保存用の日付形式に変換する

ログやデータベース保存では、環境によって変わらない形式を使うことが重要です。

C#
DateTime now = DateTime.UtcNow;

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

Console.WriteLine(text);

APIやJSONで日時を扱う場合は、ISO 8601形式がよく使われます。

C#
DateTime utcNow = DateTime.UtcNow;

string isoText = utcNow.ToString("o");

Console.WriteLine(isoText);

出力例です。

C#
2026-06-11T06:30:45.0000000Z

DBに保存する場合は、文字列ではなく日時型として保存できるなら、日時型を使うのが基本です。表示形式は保存時ではなく、画面表示時に整えるほうが扱いやすくなります。

11. C#の日付操作で起きやすいエラーと注意点

11-1. ParseでFormatExceptionが発生する原因

DateTime.Parseは、変換できない文字列が渡されるとFormatExceptionを発生させます。

C#
DateTime date = DateTime.Parse("2026-99-99");

このような入力は日付として不正です。

ユーザー入力を扱う場合は、ParseよりもTryParseを使うほうが安全です。

C#
string input = "2026-99-99";

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

特定の形式だけを許可したい場合は、TryParseExactを使います。

C#
using System.Globalization;

string input = "20260611";

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

11-2. 月末日の加算で意図しない日付になるケース

AddMonthsを使うと、月末日で意図しない結果になることがあります。

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

DateTime result = date.AddMonths(1);

Console.WriteLine(result);

出力結果です。

C#
2026/02/28 0:00:00

これは、2月31日が存在しないためです。

請求日や契約更新日などで「毎月末」を扱う場合は、単純にAddMonthsするだけでは要件に合わない可能性があります。

毎月末を求める場合は、次のように月末日を明示的に計算します。

C#
DateTime GetEndOfMonth(DateTime date)
{
int lastDay = DateTime.DaysInMonth(date.Year, date.Month);
return new DateTime(date.Year, date.Month, lastDay);
}

翌月末を取得する例です。

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

DateTime nextMonth = date.AddMonths(1);
DateTime nextMonthEnd = GetEndOfMonth(nextMonth);

Console.WriteLine(nextMonthEnd);

11-3. DateTimeKindとタイムゾーンの混同に注意する

DateTimeKindは、DateTimeがローカル時刻なのかUTCなのかを示す情報です。

C#
DateTime local = DateTime.Now;
DateTime utc = DateTime.UtcNow;

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

ただし、DateTimeKind.Localであっても、「日本時間」や「米国東部時間」などのタイムゾーン名を保持しているわけではありません。

タイムゾーンを明確に扱う必要がある場合は、TimeZoneInfoDateTimeOffsetを使うことを検討します。

C#
DateTime utcNow = DateTime.UtcNow;

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

Console.WriteLine(tokyoTime);

11-4. UTCとローカル時刻を混在させない

UTCとローカル時刻を混在させると、比較や保存でバグが起きやすくなります。

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

この2つは同じ瞬間を表していても、値としては異なります。

データベースに保存する日時はUTCに統一し、画面表示時にユーザーのタイムゾーンへ変換する設計にすると、混乱を減らせます。

C#
DateTime savedAt = DateTime.UtcNow;

ローカル表示が必要な場合は、表示時に変換します。

C#
DateTime localTime = savedAt.ToLocalTime();

システム全体で「保存はUTC」「表示はローカル」のようにルールを決めておくことが重要です。

11-5. nullを扱う場合はNullable<DateTime>を使う

DateTimeは値型なので、そのままではnullを代入できません。

C#
DateTime date = null;

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

日付が未設定になる可能性がある場合は、DateTime?を使います。

C#
DateTime? completedAt = null;

if (completedAt.HasValue)
{
Console.WriteLine(completedAt.Value);
}
else
{
Console.WriteLine("未完了です");
}

DateTime?Nullable<DateTime>の省略形です。

C#
Nullable<DateTime> startedAt = null;

データベースのNULL許可カラムや、任意入力の日付項目を扱う場合によく使います。

11-6. DateTime.Nowをテストしやすくする設計

コード内で直接DateTime.Nowを使いすぎると、テストが難しくなります。

C#
public bool IsExpired(DateTime dueDate)
{
return dueDate < DateTime.Now;
}

このコードは現在時刻に依存しているため、テスト実行時刻によって結果が変わる可能性があります。

対策として、現在日時を外から渡す設計にします。

C#
public bool IsExpired(DateTime dueDate, DateTime now)
{
return dueDate < now;
}

使い方です。

C#
DateTime dueDate = new DateTime(2026, 6, 10);
DateTime now = new DateTime(2026, 6, 11);

bool result = IsExpired(dueDate, now);

このようにすると、テストで任意の現在日時を指定できます。

クラス設計では、時刻取得用のインターフェースを用意する方法もあります。

C#
public interface IClock
{
DateTime Now { get; }
}

public class SystemClock : IClock
{
public DateTime Now => DateTime.Now;
}

テストでは固定日時を返す実装に差し替えられます。

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

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

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

C#
DateTime today = DateTime.Today;

Console.WriteLine(today);

DateTime.Todayは、現在日の00:00:00を返します。

現在日時を取得したい場合はDateTime.Nowを使います。

C#
DateTime now = DateTime.Now;

日付のみを比較したい場合は、.Dateを使う方法もあります。

C#
if (someDate.Date == DateTime.Today)
{
Console.WriteLine("今日です");
}

12-2. C#で日付をyyyyMMdd形式にするには?

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

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

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

Console.WriteLine(text);

出力結果です。

C#
20260611

ファイル名やIDの一部として使う場合にも便利です。

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

時刻まで含めたい場合は次のようにします。

C#
string text = DateTime.Now.ToString("yyyyMMddHHmmss");

12-3. C#で文字列の日付をDateTimeに変換するには?

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

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

DateTime date = DateTime.Parse(text);

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

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

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

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

C#
using System.Globalization;

string text = "20260611";

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

12-4. C#で日付のみ比較するには?

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

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

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

DateTimeは時刻まで含めて比較されます。そのため、日付だけを比較したい場合は.Dateを付けるのがポイントです。

C#
if (targetDate.Date < DateTime.Today)
{
Console.WriteLine("今日より前です");
}

12-5. C#で日付の差分を日数で取得するには?

2つのDateTimeを引き算して、TimeSpanDaysまたはTotalDaysを使います。

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

TimeSpan diff = end - start;

Console.WriteLine(diff.Days);

出力結果です。

C#
10

小数を含む日数を取得したい場合は、TotalDaysを使います。

C#
Console.WriteLine(diff.TotalDays);

日付だけで差分を出したい場合は、.Dateを使います。

C#
int days = (end.Date - start.Date).Days;

12-6. DateTimeとDateTimeOffsetはどちらを使うべき?

単純なローカル日時や、日付と時刻だけを扱う場合はDateTimeで十分なことが多いです。

一方、タイムゾーンやUTCとの差分を明確に扱いたい場合は、DateTimeOffsetが向いています。

C#
DateTimeOffset now = DateTimeOffset.Now;

Console.WriteLine(now);

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

C#
2026/06/11 15:30:45 +09:00

グローバルなシステム、API、ログ、外部連携では、DateTimeOffsetを使うことで、どのオフセットの日時なのかを明確にできます。

ただし、日付のみが必要な場合はDateOnly、時刻のみが必要な場合はTimeOnlyも選択肢になります。

12-7. DateOnlyはどんな場面で使うべき?

DateOnlyは、時刻が不要な日付を扱う場面に向いています。

たとえば次のようなデータです。

用途
生年月日1995/04/10
締切日2026/06/30
営業日2026/06/11
記念日2026/12/25
予約日2026/07/01

DateTimeで日付のみを扱うと、時刻部分の00:00:00が含まれます。そのため、比較時に意図しない結果になることがあります。

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

Console.WriteLine(dateTime.Date);

日付のみという意味をコード上で明確にしたい場合は、DateOnlyを使うとわかりやすくなります。

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

まとめ

C#の日付操作では、主にDateTimeを使って日付と時刻を扱います。

現在日時を取得するにはDateTime.Now、今日の日付だけを取得するにはDateTime.Today、UTC時刻を取得するにはDateTime.UtcNowを使います。

任意の日付を作成する場合はnew DateTimeを使い、日付の加算や減算にはAddDaysAddMonthsAddYearsAddHoursなどを使います。

日付の比較では、時刻まで含めて比較される点に注意が必要です。日付のみを比較したい場合は、Dateプロパティを使いましょう。

文字列への変換ではToString、文字列から日付への変換ではParseTryParseParseExactTryParseExactを使います。特にユーザー入力を扱う場合は、例外を防ぐためにTryParseTryParseExactを使うのがおすすめです。

また、.NET 6以降では、日付のみを扱うDateOnly、時刻のみを扱うTimeOnlyも利用できます。生年月日や締切日のように時刻が不要な場合はDateOnly、営業時間や開始時刻のように日付が不要な場合はTimeOnlyを使うと、コードの意図が明確になります。

C#の日付操作では、フォーマット、タイムゾーン、UTCとローカル時刻の違い、月末日の計算、nullの扱いなどでミスが起きやすいため、用途に応じて適切な型とメソッドを選ぶことが重要です。