C# DateTimeの使い方完全ガイド|日付・時刻の取得、変換、比較、フォーマットを初心者向けに解説

はじめに

C#で日付や時刻を扱うときに最もよく使う型がDateTimeです。

現在日時の取得、日付の作成、文字列への変換、文字列からの日付変換、日付比較、加算・減算、経過時間の計算など、アプリケーション開発では非常に多くの場面で登場します。

たとえば、次のような処理でDateTimeを使います。

C#
DateTime now = DateTime.Now;

Console.WriteLine(now);

DateTimeは便利な一方で、初心者がつまずきやすいポイントもあります。

特に、次のような点には注意が必要です。

  • DateTime.NowDateTime.UtcNowの違い

  • yyyyYYYYのようなフォーマット指定の違い

  • MMmmの違い

  • 文字列を日付に変換するときのエラー

  • タイムゾーンやサマータイムの扱い

  • DateTimeDateTimeOffsetDateOnlyTimeOnlyの使い分け

この記事では、C# DateTimeの基本から実務でよく使う処理まで、初心者にもわかりやすく解説します。

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

DateTimeは、C#で日付と時刻を表すための構造体です。

年月日だけでなく、時・分・秒・ミリ秒まで扱えます。

C#
DateTime date = new DateTime(2026, 1, 15);
DateTime dateTime = new DateTime(2026, 1, 15, 10, 30, 0);

Console.WriteLine(date);
Console.WriteLine(dateTime);

DateTimeは、予約日時、登録日時、更新日時、期限、ログ出力、年齢計算など、さまざまな場面で使われます。

1-1. DateTimeでできること

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

C#
DateTime now = DateTime.Now;

// 年月日を取得
int year = now.Year;
int month = now.Month;
int day = now.Day;

// 文字列に変換
string text = now.ToString("yyyy/MM/dd HH:mm:ss");

// 日付を加算
DateTime tomorrow = now.AddDays(1);

// 日付を比較
bool isFuture = tomorrow > now;

代表的な用途は次のとおりです。

  • 現在日時を取得する

  • 任意の日付を作成する

  • 年、月、日、時、分、秒を取り出す

  • 日付を指定形式の文字列に変換する

  • 文字列を日付に変換する

  • 日付同士を比較する

  • 日付を加算・減算する

  • 日付同士の差分を求める

  • タイムゾーンを考慮して時刻を扱う

1-2. DateTimeが扱う値の範囲

DateTimeが扱える範囲は、最小値から最大値まで決まっています。

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

DateTime.MinValueは、0001/01/01 00:00:00です。

DateTime.MaxValueは、9999/12/31 23:59:59.9999999です。

C#
DateTime min = DateTime.MinValue;
DateTime max = DateTime.MaxValue;

Console.WriteLine(min);
Console.WriteLine(max);

この範囲外の日付を作ろうとすると、ArgumentOutOfRangeExceptionが発生します。

C#
// エラーになる例
DateTime invalid = new DateTime(10000, 1, 1);

1-3. DateTimeとstring・int・TimeSpanの違い

DateTimeは、日付と時刻そのものを表す型です。

一方で、stringintTimeSpanとは役割が異なります。

C#
DateTime date = new DateTime(2026, 1, 15);
string text = "2026/01/15";
int year = 2026;
TimeSpan span = TimeSpan.FromDays(3);

それぞれの違いは次のとおりです。

役割
DateTime日付と時刻を表す2026/01/15 10:30:00
string文字列を表す"2026/01/15"
int整数を表す2026
TimeSpan時間の長さや差分を表す3日、2時間、30分

DateTimeは「ある時点」を表します。

TimeSpanは「時間の長さ」を表します。

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

TimeSpan diff = end - start;

Console.WriteLine(diff.Days); // 9

このように、日付同士の差分を取るとTimeSpanになります。

1-4. 初心者がDateTimeでつまずきやすいポイント

初心者がDateTimeでつまずきやすいのは、主に次のポイントです。

1つ目は、文字列とDateTimeを混同することです。

C#
string text = "2026/01/15";
DateTime date = DateTime.Parse(text);

"2026/01/15"はあくまで文字列です。

日付として比較や加算をしたい場合は、DateTimeに変換する必要があります。

2つ目は、フォーマット指定の間違いです。

C#
DateTime now = DateTime.Now;

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

MMは月、mmは分です。

C#
Console.WriteLine(now.ToString("yyyy/MM/dd")); // 月
Console.WriteLine(now.ToString("HH:mm:ss")); // 分

3つ目は、DateTime.NowDateTime.UtcNowの違いです。

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

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

国内だけで使う簡単なアプリならDateTime.Nowで十分なこともありますが、海外ユーザーやサーバー間連携がある場合はUTCやDateTimeOffsetを検討する必要があります。

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

C#で現在の日付や時刻を取得するには、DateTime.NowDateTime.TodayDateTime.UtcNowを使います。

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

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

C#
DateTime now = DateTime.Now;

Console.WriteLine(now);

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

たとえば、日本の環境で実行すれば日本時間の現在日時になります。

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);

登録日時や更新日時を記録するときによく使います。

C#
DateTime createdAt = DateTime.Now;
DateTime updatedAt = DateTime.Now;

ただし、サーバーの地域設定やタイムゾーンに依存するため、グローバルなシステムでは注意が必要です。

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

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

C#
DateTime today = DateTime.Today;

Console.WriteLine(today);

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

つまり、時刻部分は常に午前0時です。

C#
DateTime today = DateTime.Today;

Console.WriteLine(today.ToString("yyyy/MM/dd HH:mm:ss"));
// 例: 2026/01/15 00:00:00

日付だけを比較したい場合に便利です。

C#
DateTime targetDate = new DateTime(2026, 1, 15, 18, 30, 0);

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

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

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

C#
DateTime utcNow = DateTime.UtcNow;

Console.WriteLine(utcNow);

UTCは協定世界時のことです。

タイムゾーンに依存しない基準時刻として使われます。

C#
DateTime savedAt = DateTime.UtcNow;

実務では、データベースに保存する日時はUTCで統一し、画面表示時にユーザーのローカル時刻へ変換する設計がよく使われます。

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

Console.WriteLine(local);

2-4. Now・Today・UtcNowの違いと使い分け

DateTime.NowDateTime.TodayDateTime.UtcNowの違いは次のとおりです。

プロパティ取得できる値主な用途
DateTime.Nowローカルの現在日時画面表示、ローカルアプリ
DateTime.Today今日の日付の0時日付だけの比較
DateTime.UtcNowUTCの現在日時DB保存、API連携、グローバル対応

使い分けの例です。

C#
// ローカルの現在日時
DateTime now = DateTime.Now;

// 今日の日付だけ
DateTime today = DateTime.Today;

// UTCの現在日時
DateTime utcNow = DateTime.UtcNow;

単純な表示だけならDateTime.Nowでも問題ありません。

日付だけを扱うならDateTime.Today.Dateを使うと便利です。

サーバーやAPI、データベースで日時を扱う場合はDateTime.UtcNowを使うと、タイムゾーンによるズレを避けやすくなります。

2-5. MinValue・MaxValueで最小値・最大値を扱う

DateTime.MinValueDateTime.MaxValueを使うと、DateTimeの最小値と最大値を取得できます。

C#
DateTime min = DateTime.MinValue;
DateTime max = DateTime.MaxValue;

Console.WriteLine(min);
Console.WriteLine(max);

初期値としてDateTime.MinValueが入っているかどうかを判定することもあります。

C#
DateTime date = DateTime.MinValue;

if (date == DateTime.MinValue)
{
Console.WriteLine("日付が未設定です");
}

ただし、未設定を表したい場合は、DateTime.MinValueよりもDateTime?を使う方が自然です。

C#
DateTime? date = null;

if (date == null)
{
Console.WriteLine("日付が未設定です");
}

3. DateTimeオブジェクトを作成する方法

任意の日付や時刻を表すDateTimeオブジェクトは、new DateTime(...)で作成できます。

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

年月日を指定してDateTimeを作成する基本形です。

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

Console.WriteLine(date);

この場合、時刻は00:00:00になります。

C#
Console.WriteLine(date.ToString("yyyy/MM/dd HH:mm:ss"));
// 2026/01/15 00:00:00

年月日だけを扱いたい場合によく使います。

C#
DateTime birthday = new DateTime(1990, 5, 20);
DateTime startDate = new DateTime(2026, 4, 1);

3-2. 時分秒まで指定してDateTimeを作成する

時・分・秒まで指定する場合は、次のように書きます。

C#
DateTime dateTime = new DateTime(2026, 1, 15, 10, 30, 45);

Console.WriteLine(dateTime);

引数の順番は次のとおりです。

C#
new DateTime(, , , , , )

例です。

C#
DateTime meetingTime = new DateTime(2026, 1, 15, 14, 0, 0);

Console.WriteLine(meetingTime.ToString("yyyy/MM/dd HH:mm:ss"));

予約日時や開始日時、終了日時などを表すときに使います。

3-3. ミリ秒・Ticksを指定して作成する

ミリ秒まで指定することもできます。

C#
DateTime dateTime = new DateTime(2026, 1, 15, 10, 30, 45, 123);

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

fffはミリ秒を表すフォーマットです。

また、Ticksを使ってDateTimeを作成することもできます。

C#
DateTime now = DateTime.Now;
long ticks = now.Ticks;

DateTime dateTime = new DateTime(ticks);

Console.WriteLine(dateTime);

Ticksは、0001/01/01 00:00:00からの100ナノ秒単位の経過数を表します。

通常のアプリ開発では、Ticksを直接使う機会は多くありません。

ログや高精度な時刻管理、内部的な値の保存などで使うことがあります。

3-4. DateTimeKindを指定して作成する

DateTimeには、時刻の種類を表すDateTimeKindがあります。

指定できる値は次の3つです。

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

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

C#
DateTime localTime = new DateTime(2026, 1, 15, 10, 30, 0, DateTimeKind.Local);
DateTime utcTime = new DateTime(2026, 1, 15, 10, 30, 0, DateTimeKind.Utc);
DateTime unspecifiedTime = new DateTime(2026, 1, 15, 10, 30, 0, DateTimeKind.Unspecified);

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

DateTimeKindは、ToLocalTimeToUniversalTimeの変換時に影響します。

C#
DateTime utc = new DateTime(2026, 1, 15, 1, 0, 0, DateTimeKind.Utc);
DateTime local = utc.ToLocalTime();

Console.WriteLine(local);

3-5. 不正な日付を指定したときのエラー

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

C#
// 2月30日は存在しないためエラー
DateTime invalid = new DateTime(2026, 2, 30);

月に13を指定してもエラーになります。

C#
// 13月は存在しないためエラー
DateTime invalid = new DateTime(2026, 13, 1);

日付をユーザー入力から作成する場合は、いきなりnew DateTimeするのではなく、入力値のチェックが重要です。

C#
int year = 2026;
int month = 2;
int day = 30;

if (month >= 1 && month <= 12 && day >= 1 && day <= DateTime.DaysInMonth(year, month))
{
DateTime date = new DateTime(year, month, day);
Console.WriteLine(date);
}
else
{
Console.WriteLine("不正な日付です");
}

4. DateTimeから年・月・日・時・分・秒を取得する

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

4-1. Year・Month・Dayの使い方

年、月、日を取得するには、YearMonthDayを使います。

C#
DateTime date = new DateTime(2026, 1, 15, 10, 30, 45);

int year = date.Year;
int month = date.Month;
int day = date.Day;

Console.WriteLine(year);
Console.WriteLine(month);
Console.WriteLine(day);

出力例です。

C#
2026
1
15

画面表示や条件判定でよく使います。

C#
if (date.Year == 2026)
{
Console.WriteLine("2026年の日付です");
}

4-2. Hour・Minute・Second・Millisecondの使い方

時、分、秒、ミリ秒を取得するには、HourMinuteSecondMillisecondを使います。

C#
DateTime date = new DateTime(2026, 1, 15, 10, 30, 45, 123);

Console.WriteLine(date.Hour);
Console.WriteLine(date.Minute);
Console.WriteLine(date.Second);
Console.WriteLine(date.Millisecond);

出力例です。

C#
10
30
45
123

営業時間内かどうかを判定する例です。

C#
DateTime now = DateTime.Now;

if (now.Hour >= 9 && now.Hour < 18)
{
Console.WriteLine("営業時間内です");
}
else
{
Console.WriteLine("営業時間外です");
}

4-3. DayOfWeekで曜日を取得する

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

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

DayOfWeek dayOfWeek = date.DayOfWeek;

Console.WriteLine(dayOfWeek);

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("平日です");
}

日本語の曜日として表示したい場合は、後述するCultureInfoやカスタム処理を使います。

4-4. DayOfYearで年内の日数を取得する

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

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

Console.WriteLine(date.DayOfYear);

1月1日は1、1月15日は15です。

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

Console.WriteLine(date.DayOfYear);

うるう年の場合は、12月31日が366日目になります。

C#
DateTime leapYearDate = new DateTime(2024, 12, 31);

Console.WriteLine(leapYearDate.DayOfYear); // 366

4-5. Date・TimeOfDayで日付部分と時刻部分を分ける

Dateを使うと、日付部分だけを取得できます。

C#
DateTime dateTime = new DateTime(2026, 1, 15, 10, 30, 45);

DateTime dateOnly = dateTime.Date;

Console.WriteLine(dateOnly.ToString("yyyy/MM/dd HH:mm:ss"));

時刻部分は00:00:00になります。

時刻部分だけを取得するには、TimeOfDayを使います。

C#
TimeSpan time = dateTime.TimeOfDay;

Console.WriteLine(time);

TimeOfDayの戻り値はTimeSpanです。

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

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

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

5. DateTimeを文字列に変換する方法

DateTimeを画面に表示したり、ログに出力したりする場合は、文字列に変換します。

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

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

C#
DateTime now = DateTime.Now;

string text = now.ToString();

Console.WriteLine(text);

ただし、引数なしのToString()は実行環境の地域設定に影響されます。

そのため、実務ではフォーマットを明示することが多いです。

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

Console.WriteLine(text);

5-2. yyyy/MM/dd形式にフォーマットする

日付をyyyy/MM/dd形式で表示する例です。

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

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

Console.WriteLine(text);

出力結果です。

C#
2026/01/15

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

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

Console.WriteLine(date.ToString("yyyy/MM/dd")); // 2026/05/03
Console.WriteLine(date.ToString("yyyy/M/d")); // 2026/5/3

ゼロ埋めしたい場合はMMddを使います。

5-3. yyyy-MM-dd HH:mm:ss形式にフォーマットする

日時をyyyy-MM-dd HH:mm:ss形式で表示する例です。

C#
DateTime dateTime = new DateTime(2026, 1, 15, 10, 30, 45);

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

Console.WriteLine(text);

出力結果です。

C#
2026-01-15 10:30:45

ログ出力やCSV出力、システム間連携でよく使われる形式です。

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

Console.WriteLine(logTime);

ミリ秒まで出したい場合はfffを使います。

5-4. 日本語の年月日・曜日付きで表示する

日本語の年月日形式で表示する例です。

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

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

Console.WriteLine(text);

出力結果です。

C#
2026年01月15日

曜日を付ける場合はdddまたはddddを使います。

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

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

日本語の曜日で表示したい場合は、CultureInfoを指定します。

C#
using System.Globalization;

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

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

Console.WriteLine(text);

5-5. 標準日時書式指定子の使い方

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

C#
DateTime date = new DateTime(2026, 1, 15, 10, 30, 45);

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

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

指定子意味
d短い日付形式
D長い日付形式
t短い時刻形式
T長い時刻形式
f長い日付 + 短い時刻
F長い日付 + 長い時刻
g短い日付 + 短い時刻
G短い日付 + 長い時刻
oラウンドトリップ形式
sソート可能な形式
uUTCのソート可能形式

実行環境やCultureInfoによって表示結果が変わる指定子もあります。

形式を完全に固定したい場合は、カスタム日時書式指定子を使います。

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

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

指定子意味
yyyy4桁の年2026
yy2桁の年26
MM2桁の月01
M1桁または2桁の月1
dd2桁の日05
d1桁または2桁の日5
HH24時間表記の時09
H24時間表記の時9
hh12時間表記の時09
mm30
ss45
fffミリ秒123
ddd短い曜日名
dddd長い曜日名木曜日

特に注意したいのは、MMmmの違いです。

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

Console.WriteLine(date.ToString("yyyy/MM/dd HH:mm"));
// 2026/01/15 10:05

MMは月、mmは分です。

C#
Console.WriteLine(date.ToString("yyyy/mm/dd"));
// 間違い。mmは分なので、意図しない表示になる

5-7. CultureInfoで日本語・英語など表示文化を指定する

CultureInfoを使うと、日本語や英語など、表示文化を指定できます。

C#
using System.Globalization;

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

CultureInfo ja = new CultureInfo("ja-JP");
CultureInfo en = new CultureInfo("en-US");

Console.WriteLine(date.ToString("D", ja));
Console.WriteLine(date.ToString("D", en));

日本語の曜日を表示する例です。

C#
using System.Globalization;

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

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

英語の曜日を表示する例です。

C#
using System.Globalization;

DateTime date = new DateTime(2026, 1, 15);
CultureInfo culture = new CultureInfo("en-US");

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

地域設定に依存しない表示をしたい場合は、CultureInfo.InvariantCultureも使えます。

C#
using System.Globalization;

DateTime date = DateTime.Now;

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

Console.WriteLine(text);

6. 文字列をDateTimeに変換する方法

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

6-1. DateTime.Parseの基本

DateTime.Parseは、文字列をDateTimeに変換します。

C#
string text = "2026/01/15";

DateTime date = DateTime.Parse(text);

Console.WriteLine(date);

日時文字列も変換できます。

C#
string text = "2026/01/15 10:30:45";

DateTime dateTime = DateTime.Parse(text);

Console.WriteLine(dateTime);

ただし、変換できない文字列を渡すとFormatExceptionが発生します。

C#
string text = "abc";

DateTime date = DateTime.Parse(text); // エラー

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

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

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

C#
string text = "2026/01/15";

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

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

変換できない文字列でも例外が発生しません。

C#
string text = "abc";

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

入力フォームやCSV読み込みなど、外部から入ってくる文字列を処理する場合はTryParseを使うのがおすすめです。

6-3. ParseExactで形式を指定して変換する

ParseExactを使うと、指定した形式に一致する文字列だけを変換できます。

C#
using System.Globalization;

string text = "2026-01-15";

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

Console.WriteLine(date);

指定形式と違う文字列はエラーになります。

C#
using System.Globalization;

string text = "2026/01/15";

// 形式が yyyy-MM-dd ではないためエラー
DateTime date = DateTime.ParseExact(
text,
"yyyy-MM-dd",
CultureInfo.InvariantCulture
);

ログや固定フォーマットのCSVなど、入力形式が決まっている場合に便利です。

6-4. TryParseExactで例外を出さずに変換する

TryParseExactは、形式を指定しつつ、例外を出さずに変換できます。

C#
using System.Globalization;

string text = "2026-01-15";

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

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

ユーザー入力を厳密にチェックしたい場合に適しています。

C#
using System.Globalization;

string input = "20260115";

if (DateTime.TryParseExact(
input,
"yyyyMMdd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("yyyyMMdd形式で入力してください");
}

6-5. yyyyMMddなど区切り文字なしの日付を変換する

20260115のような区切り文字なしの日付を変換するには、ParseExactまたはTryParseExactを使います。

C#
using System.Globalization;

string text = "20260115";

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

Console.WriteLine(date);

安全に変換するならTryParseExactを使います。

C#
using System.Globalization;

string text = "20260115";

if (DateTime.TryParseExact(
text,
"yyyyMMdd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
Console.WriteLine(date.ToString("yyyy/MM/dd"));
}
else
{
Console.WriteLine("変換できませんでした");
}

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

C#
using System.Globalization;

string text = "2026/01/15";

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

if (DateTime.TryParseExact(
text,
formats,
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
Console.WriteLine(date);
}

6-6. 変換できない文字列の原因と対処法

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

  • 日付として存在しない

  • フォーマットが違う

  • 月と分の指定を間違えている

  • 地域設定と入力形式が合っていない

  • 空文字やnullが渡されている

  • 全角文字や余分なスペースが含まれている

例です。

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

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

Console.WriteLine(success); // false

存在しない日付は変換できません。

前後の空白が原因になる場合は、Trimで取り除きます。

C#
string text = " 2026/01/15 ";

text = text.Trim();

if (DateTime.TryParse(text, out DateTime date))
{
Console.WriteLine(date);
}

形式が決まっている場合は、TryParseExactで明示的に指定するのが安全です。

C#
using System.Globalization;

string text = "2026-01-15";

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

7. DateTimeを比較する方法

DateTimeは比較演算子やメソッドを使って比較できます。

7-1. 比較演算子で日付・時刻を比較する

最もわかりやすい方法は、比較演算子を使う方法です。

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

Console.WriteLine(a < b); // true
Console.WriteLine(a > b); // false
Console.WriteLine(a == b); // false
Console.WriteLine(a != b); // true

期限切れかどうかを判定する例です。

C#
DateTime deadline = new DateTime(2026, 1, 15, 23, 59, 59);

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

7-2. Compareメソッドで比較する

DateTime.Compareを使って比較することもできます。

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

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

Console.WriteLine(result);

戻り値の意味は次のとおりです。

戻り値意味
0より小さいaはbより前
0aとbは同じ
0より大きいaはbより後

使用例です。

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("同じ日時です");
}

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

CompareToは、インスタンスから別のDateTimeを比較するメソッドです。

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

int result = a.CompareTo(b);

Console.WriteLine(result);

意味はDateTime.Compareと同じです。

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

ソート処理などでも使えます。

C#
List<DateTime> dates = new List<DateTime>
{
new DateTime(2026, 1, 20),
new DateTime(2026, 1, 10),
new DateTime(2026, 1, 15)
};

dates.Sort();

foreach (DateTime date in dates)
{
Console.WriteLine(date.ToString("yyyy/MM/dd"));
}

7-4. 日付だけを比較する方法

時刻を無視して日付だけを比較するには、.Dateを使います。

C#
DateTime a = new DateTime(2026, 1, 15, 10, 0, 0);
DateTime b = new DateTime(2026, 1, 15, 18, 30, 0);

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

今日かどうかを判定する場合も.Dateを使います。

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

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

DateTime.Todayは今日の00:00:00なので、日付比較に便利です。

7-5. 時刻だけを比較する方法

時刻だけを比較するには、TimeOfDayを使います。

C#
DateTime a = new DateTime(2026, 1, 15, 9, 0, 0);
DateTime b = new DateTime(2026, 1, 20, 18, 0, 0);

if (a.TimeOfDay < b.TimeOfDay)
{
Console.WriteLine("aの時刻はbより前です");
}

営業時間内かどうかを判定する例です。

C#
DateTime now = DateTime.Now;

TimeSpan start = new TimeSpan(9, 0, 0);
TimeSpan end = new TimeSpan(18, 0, 0);

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

7-6. 文字列のまま比較してはいけないケース

日付を文字列のまま比較すると、意図しない結果になることがあります。

C#
string a = "2026/1/5";
string b = "2026/1/15";

Console.WriteLine(a.CompareTo(b));

文字列比較は、日付の大小ではなく文字の並びで比較されます。

そのため、日付として比較したい場合はDateTimeに変換してから比較します。

C#
DateTime a = DateTime.Parse("2026/1/5");
DateTime b = DateTime.Parse("2026/1/15");

if (a < b)
{
Console.WriteLine("aはbより前の日付です");
}

ただし、yyyyMMddyyyy-MM-ddのように桁数が固定されている形式では、文字列比較でも順序が一致することがあります。

C#
string a = "20260105";
string b = "20260115";

Console.WriteLine(string.Compare(a, b) < 0); // true

とはいえ、実務では日付比較はDateTimeで行う方が安全です。

8. DateTimeで日付・時刻を加算・減算する方法

DateTimeには、日付や時刻を加算・減算するためのメソッドが用意されています。

8-1. AddDaysで日数を足す・引く

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

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

DateTime nextDay = date.AddDays(1);

Console.WriteLine(nextDay);

日数を引きたい場合は、負の値を指定します。

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

DateTime previousDay = date.AddDays(-1);

Console.WriteLine(previousDay);

1週間後を求める例です。

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

8-2. AddMonthsで月数を足す・引く

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

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

DateTime nextMonth = date.AddMonths(1);

Console.WriteLine(nextMonth);

月を引く場合は負の値を指定します。

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

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

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

DateTime nextMonth = date.AddMonths(1);

Console.WriteLine(nextMonth);

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

8-3. AddYearsで年数を足す・引く

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

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

DateTime nextYear = date.AddYears(1);

Console.WriteLine(nextYear);

年を引く場合は負の値を指定します。

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

うるう年の2月29日に対してAddYearsを使う場合は注意が必要です。

C#
DateTime date = new DateTime(2024, 2, 29);

DateTime nextYear = date.AddYears(1);

Console.WriteLine(nextYear);

2025年には2月29日がないため、結果は2025年2月28日になります。

8-4. AddHours・AddMinutes・AddSecondsで時刻を操作する

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

C#
DateTime dateTime = new DateTime(2026, 1, 15, 10, 0, 0);

DateTime result = dateTime.AddHours(2);

Console.WriteLine(result);

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

C#
DateTime result = dateTime.AddMinutes(30);

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

C#
DateTime result = dateTime.AddSeconds(45);

負の値を指定すると減算できます。

C#
DateTime dateTime = new DateTime(2026, 1, 15, 10, 0, 0);

Console.WriteLine(dateTime.AddHours(-1));
Console.WriteLine(dateTime.AddMinutes(-30));
Console.WriteLine(dateTime.AddSeconds(-10));

8-5. 日付同士の差分を取得する

日付同士の差分を取得するには、DateTime同士を引き算します。

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

TimeSpan diff = end - start;

Console.WriteLine(diff.Days);

出力結果です。

C#
14

現在から期限までの残り日数を求める例です。

C#
DateTime deadline = new DateTime(2026, 1, 31);
TimeSpan remaining = deadline - DateTime.Today;

Console.WriteLine($"残り{remaining.Days}日です");

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

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

C#
DateTime start = new DateTime(2026, 1, 1, 9, 0, 0);
DateTime end = new DateTime(2026, 1, 2, 10, 30, 0);

TimeSpan diff = end - start;

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

DaysHoursは、日・時・分の各部分を表します。

一方、TotalDaysTotalHoursは、全体を日数や時間に換算した値です。

C#
Console.WriteLine(diff.Days);       // 日数部分
Console.WriteLine(diff.TotalDays); // 全体を日数に換算

経過時間を正確に計算したい場合は、TotalHoursTotalMinutesを使うことが多いです。

9. DateTimeの実務でよく使う処理パターン

ここでは、実務でよく使うDateTimeの処理パターンを紹介します。

9-1. 今日かどうかを判定する

対象日時が今日かどうかを判定するには、.DateDateTime.Todayを比較します。

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

if (target.Date == DateTime.Today)
{
Console.WriteLine("今日です");
}
else
{
Console.WriteLine("今日ではありません");
}

時刻まで比較してしまうと一致しにくいため、日付だけを比較するのがポイントです。

C#
// 非推奨
if (target == DateTime.Today)
{
Console.WriteLine("今日です");
}

DateTime.Todayは今日の0時なので、時刻が入っているDateTimeとは一致しないことが多いです。

9-2. 期限切れかどうかを判定する

期限切れ判定は、現在日時と期限を比較します。

C#
DateTime deadline = new DateTime(2026, 1, 15, 23, 59, 59);

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

日付だけで期限を判定したい場合は、.Dateを使います。

C#
DateTime deadlineDate = new DateTime(2026, 1, 15);

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

「期限日当日までは有効」としたい場合は、>で比較します。

「期限日になったら期限切れ」としたい場合は、>=で比較します。

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

9-3. 月初・月末の日付を取得する

月初を取得するには、その月の1日を作成します。

C#
DateTime today = DateTime.Today;

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

Console.WriteLine(firstDay);

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

C#
DateTime today = DateTime.Today;

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

Console.WriteLine(lastDate);

または、翌月の1日から1日引く方法もあります。

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

Console.WriteLine(lastDay);

9-4. 翌営業日・前日・翌日を求める

翌日を求めるにはAddDays(1)を使います。

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

前日を求めるにはAddDays(-1)を使います。

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

土日を除いた翌営業日を求める簡単な例です。

C#
DateTime GetNextBusinessDay(DateTime date)
{
DateTime next = date.AddDays(1);

while (next.DayOfWeek == DayOfWeek.Saturday ||
next.DayOfWeek == DayOfWeek.Sunday)
{
next = next.AddDays(1);
}

return next;
}

DateTime nextBusinessDay = GetNextBusinessDay(DateTime.Today);

Console.WriteLine(nextBusinessDay);

祝日も考慮する場合は、祝日リストを別途用意する必要があります。

C#
DateTime GetNextBusinessDay(DateTime date, HashSet<DateTime> holidays)
{
DateTime next = date.AddDays(1);

while (next.DayOfWeek == DayOfWeek.Saturday ||
next.DayOfWeek == DayOfWeek.Sunday ||
holidays.Contains(next.Date))
{
next = next.AddDays(1);
}

return next;
}

9-5. 誕生日から年齢を計算する

誕生日から年齢を計算する例です。

C#
DateTime birthday = new DateTime(1990, 5, 20);
DateTime today = DateTime.Today;

int age = today.Year - birthday.Year;

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

Console.WriteLine(age);

考え方は次のとおりです。

まず、現在の年から誕生年を引きます。

C#
int age = today.Year - birthday.Year;

次に、今年の誕生日がまだ来ていなければ1歳引きます。

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

関数化すると使いやすくなります。

C#
int CalculateAge(DateTime birthday, DateTime today)
{
int age = today.Year - birthday.Year;

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

return age;
}

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

ログ出力では、日時形式を固定することが重要です。

C#
DateTime now = DateTime.Now;

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

Console.WriteLine(logTime);

出力例です。

C#
2026-01-15 10:30:45.123

ファイル名に使う場合は、:/などの使えない文字を避けます。

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

Console.WriteLine(fileName);

出力例です。

C#
20260115_103045.log

ログやファイル名では、地域設定に依存しない形式を使うと安全です。

10. DateTimeとタイムゾーンの扱い

DateTimeを使ううえで、タイムゾーンは非常に重要です。

特に、海外ユーザー、クラウドサーバー、API連携、データベース保存では注意が必要です。

10-1. Local・Utc・Unspecifiedの違い

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

C#
DateTime now = DateTime.Now;
DateTime utcNow = DateTime.UtcNow;
DateTime date = new DateTime(2026, 1, 15);

Console.WriteLine(now.Kind);
Console.WriteLine(utcNow.Kind);
Console.WriteLine(date.Kind);

Kindには次の3種類があります。

Kind意味
Localローカル時刻
UtcUTC時刻
UnspecifiedローカルかUTCか未指定

DateTime.NowLocalです。

C#
Console.WriteLine(DateTime.Now.Kind); // Local

DateTime.UtcNowUtcです。

C#
Console.WriteLine(DateTime.UtcNow.Kind); // Utc

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

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

Console.WriteLine(date.Kind); // Unspecified

10-2. ToLocalTimeとToUniversalTimeの使い方

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

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

Console.WriteLine(local);

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

C#
DateTime local = DateTime.Now;
DateTime utc = local.ToUniversalTime();

Console.WriteLine(utc);

ただし、DateTime.Kindによって変換の扱いが変わるため注意が必要です。

C#
DateTime unspecified = new DateTime(2026, 1, 15, 10, 0, 0);

Console.WriteLine(unspecified.Kind);
Console.WriteLine(unspecified.ToUniversalTime());

KindUnspecifiedの場合、実行環境によって期待と異なる変換になることがあります。

日時の意味が明確な場合は、DateTimeKindを指定するか、DateTimeOffsetを検討しましょう。

10-3. タイムゾーン変換で注意すべきこと

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

C#
DateTime utc = DateTime.UtcNow;

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

Console.WriteLine(tokyoTime);

Windows環境では、日本時間のタイムゾーンIDとして"Tokyo Standard Time"が使われます。

環境によってタイムゾーンIDが異なる場合があるため、Linuxやコンテナ環境で動かす場合は注意が必要です。

UTCで保存し、表示時に必要なタイムゾーンへ変換する設計にすると、日時の扱いが整理しやすくなります。

C#
DateTime savedUtc = DateTime.UtcNow;

// 表示時にローカルへ変換
DateTime displayTime = savedUtc.ToLocalTime();

10-4. サマータイムで起こる問題

サマータイムがある地域では、存在しない時刻や重複する時刻が発生することがあります。

たとえば、時計を1時間進めるタイミングでは、一部の時刻が存在しない場合があります。

逆に、時計を1時間戻すタイミングでは、同じ時刻が2回発生する場合があります。

このような地域の日時を扱う場合、単純にDateTimeだけで処理すると誤判定が起きることがあります。

C#
TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
DateTime localTime = new DateTime(2026, 3, 8, 2, 30, 0);

bool isInvalid = timeZone.IsInvalidTime(localTime);

Console.WriteLine(isInvalid);

サマータイムを考慮するシステムでは、TimeZoneInfoDateTimeOffsetを使って、タイムゾーン情報を明確に扱うことが重要です。

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

DateTimeOffsetは、日時とUTCからのオフセットを一緒に保持できる型です。

C#
DateTimeOffset now = DateTimeOffset.Now;

Console.WriteLine(now);
Console.WriteLine(now.Offset);

DateTimeは日時そのものを表しますが、タイムゾーンやオフセット情報が不十分な場合があります。

一方、DateTimeOffsetは次のようにオフセットを持ちます。

C#
DateTimeOffset dateTimeOffset = new DateTimeOffset(2026, 1, 15, 10, 30, 0, TimeSpan.FromHours(9));

Console.WriteLine(dateTimeOffset);

次のようなケースではDateTimeOffsetを検討するのがおすすめです。

  • APIで日時をやり取りする

  • 海外ユーザーがいる

  • UTCとの差を明確にしたい

  • ログや監査情報を正確に残したい

  • サーバーのタイムゾーンに依存したくない

単純な日付計算やローカルアプリならDateTimeでも十分ですが、実務のシステム連携ではDateTimeOffsetの方が安全なことがあります。

11. DateTimeとDateOnly・TimeOnlyの違い

C#では、DateTime以外にも、日付だけを扱うDateOnly、時刻だけを扱うTimeOnlyがあります。

11-1. DateOnlyとは

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

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

Console.WriteLine(date);

DateOnlyには時刻が含まれません。

そのため、誕生日、予約日、営業日、請求日など、時刻が不要なデータに向いています。

C#
DateOnly birthday = new DateOnly(1990, 5, 20);
DateOnly reservationDate = new DateOnly(2026, 1, 15);

DateTimeで日付だけを扱う場合、時刻部分に00:00:00が入ります。

C#
DateTime dateTime = new DateTime(2026, 1, 15);

Console.WriteLine(dateTime); // 2026/01/15 00:00:00

DateOnlyなら、時刻を持たないことを型として明確にできます。

11-2. TimeOnlyとは

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

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

Console.WriteLine(time);

TimeOnlyには日付が含まれません。

営業時間、開始時刻、終了時刻、アラーム時刻などに向いています。

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

DateTimeで時刻だけを扱う場合でも、必ず日付が含まれます。

C#
DateTime dateTime = new DateTime(2026, 1, 15, 10, 30, 0);

時刻だけを表したいなら、TimeOnlyを使うと意図が明確になります。

11-3. DateTimeではなくDateOnlyを使うべき場面

日付だけが必要な場合は、DateOnlyが適しています。

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

  • 誕生日

  • 入社日

  • 予約日

  • 請求日

  • 営業日

  • 祝日

  • イベント開催日

例です。

C#
DateOnly birthday = new DateOnly(1990, 5, 20);
DateOnly targetDate = DateOnly.FromDateTime(DateTime.Today);

Console.WriteLine(birthday);
Console.WriteLine(targetDate);

DateTimeで日付だけを扱うと、時刻部分が意図せず比較に影響することがあります。

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

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

日付だけを扱うなら、DateOnlyを使うことでこのような混乱を避けやすくなります。

11-4. DateTimeではなくTimeOnlyを使うべき場面

時刻だけが必要な場合は、TimeOnlyが適しています。

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

  • 営業開始時刻

  • 営業終了時刻

  • アラーム時刻

  • 毎日の通知時刻

  • 授業や勤務シフトの開始時刻

  • バッチ処理の実行時刻

例です。

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

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

DateTimeで時刻だけを扱うと、不要な日付情報が混ざります。

時刻だけの比較や保存をしたい場合は、TimeOnlyの方が意味が明確です。

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

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

扱う情報主な用途
DateTime日付 + 時刻登録日時、更新日時、予約日時
DateOnly日付のみ誕生日、営業日、請求日
TimeOnly時刻のみ営業時間、通知時刻、開始時刻

使い分けの例です。

C#
DateTime createdAt = DateTime.Now;
DateOnly birthday = new DateOnly(1990, 5, 20);
TimeOnly openingTime = new TimeOnly(9, 0);

実務では、保存したいデータの意味を考えて型を選ぶことが大切です。

「日付と時刻の両方が必要」ならDateTime

「日付だけでよい」ならDateOnly

「時刻だけでよい」ならTimeOnly

このように考えると選びやすくなります。

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

DateTimeを使うときによく発生するエラーや注意点を見ていきます。

12-1. FormatExceptionが発生する原因

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

C#
string text = "abc";

DateTime date = DateTime.Parse(text);

このコードは、abcが日付として解釈できないためエラーになります。

存在しない日付でもエラーになります。

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

DateTime date = DateTime.Parse(text);

対処法としては、TryParseを使います。

C#
string text = "abc";

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

形式が決まっている場合は、TryParseExactを使うとさらに安全です。

12-2. ArgumentOutOfRangeExceptionが発生する原因

ArgumentOutOfRangeExceptionは、存在しない日付や範囲外の値を指定したときに発生します。

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

13月は存在しないためエラーです。

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

2月30日も存在しないためエラーです。

日付を組み立てる場合は、DateTime.DaysInMonthで月の日数を確認できます。

C#
int year = 2026;
int month = 2;
int day = 30;

int days = DateTime.DaysInMonth(year, month);

if (day <= days)
{
DateTime date = new DateTime(year, month, day);
}
else
{
Console.WriteLine("存在しない日付です");
}

12-3. nullを扱いたいときはDateTime?を使う

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

C#
// エラー
DateTime date = null;

未設定や空の状態を表したい場合は、nullable型のDateTime?を使います。

C#
DateTime? date = null;

if (date == null)
{
Console.WriteLine("日付は未設定です");
}

値がある場合は、Valueで取り出せます。

C#
DateTime? date = DateTime.Now;

if (date.HasValue)
{
Console.WriteLine(date.Value);
}

ただし、Valueを使う前に必ずHasValuenullチェックを行いましょう。

C#
DateTime? date = null;

// エラーになる
Console.WriteLine(date.Value);

安全に扱うなら、次のように書きます。

C#
DateTime? date = null;

DateTime displayDate = date ?? DateTime.Today;

Console.WriteLine(displayDate);

12-4. 文字列変換で意図しない形式になる原因

DateTime.ToString()を引数なしで使うと、実行環境の地域設定に影響されます。

C#
DateTime date = new DateTime(2026, 1, 15, 10, 30, 0);

Console.WriteLine(date.ToString());

開発環境では期待通りでも、本番サーバーでは異なる形式で表示されることがあります。

形式を固定したい場合は、フォーマットを指定します。

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

さらに、文化設定の影響を避けたい場合は、CultureInfo.InvariantCultureを使います。

C#
using System.Globalization;

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

曜日や月名を日本語で出したい場合は、ja-JPを指定します。

C#
using System.Globalization;

string text = date.ToString("yyyy年MM月dd日 dddd", new CultureInfo("ja-JP"));

12-5. 端末やサーバーの地域設定による違い

DateTime.ParseToStringは、地域設定の影響を受けることがあります。

たとえば、01/02/2026という文字列は、地域によって1月2日とも2月1日とも解釈される可能性があります。

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

DateTime date = DateTime.Parse(text);

このような曖昧な形式は避けるべきです。

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

C#
using System.Globalization;

string text = "2026-01-02";

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

システム間連携では、yyyy-MM-ddやISO 8601形式のように、誤解されにくい形式を使うのがおすすめです。

12-6. データベース保存時の注意点

データベースに日時を保存するときは、タイムゾーンの扱いを統一することが重要です。

よくある方針は、UTCで保存して、表示時にローカル時刻へ変換する方法です。

C#
DateTime createdAt = DateTime.UtcNow;

表示時にローカル時刻へ変換します。

C#
DateTime localTime = createdAt.ToLocalTime();

Console.WriteLine(localTime);

注意点は次のとおりです。

  • DateTime.Nowで保存するとサーバーのタイムゾーンに依存する

  • 複数地域で使うシステムではUTC保存が扱いやすい

  • 日付だけならDateOnlyやDBの日付型を検討する

  • 時刻だけならTimeOnlyやDBの時刻型を検討する

  • API連携ではDateTimeOffsetも検討する

データベースの型やORMによって挙動が異なる場合もあるため、保存形式と取得後の解釈をチーム内で統一しておきましょう。

13. C# DateTimeの逆引き早見表

ここでは、C# DateTimeでよく使う処理を逆引き形式でまとめます。

13-1. 現在日時を取得したい

現在のローカル日時を取得します。

C#
DateTime now = DateTime.Now;

今日の日付だけを取得します。

C#
DateTime today = DateTime.Today;

UTCの現在日時を取得します。

C#
DateTime utcNow = DateTime.UtcNow;

13-2. 日付を指定して作成したい

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

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

年月日と時分秒を指定して作成します。

C#
DateTime dateTime = new DateTime(2026, 1, 15, 10, 30, 0);

ミリ秒まで指定して作成します。

C#
DateTime dateTime = new DateTime(2026, 1, 15, 10, 30, 0, 123);

13-3. DateTimeを文字列に変換したい

yyyy/MM/dd形式に変換します。

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

yyyy-MM-dd HH:mm:ss形式に変換します。

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

日本語の年月日形式に変換します。

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

曜日付きで変換します。

C#
using System.Globalization;

string text = DateTime.Now.ToString(
"yyyy年MM月dd日(ddd)",
new CultureInfo("ja-JP")
);

13-4. 文字列をDateTimeに変換したい

Parseで変換します。

C#
DateTime date = DateTime.Parse("2026/01/15");

TryParseで安全に変換します。

C#
if (DateTime.TryParse("2026/01/15", out DateTime date))
{
Console.WriteLine(date);
}

形式を指定して変換します。

C#
using System.Globalization;

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

形式を指定して安全に変換します。

C#
using System.Globalization;

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

13-5. 日付を比較したい

日時を比較します。

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

if (a < b)
{
Console.WriteLine("aはbより前です");
}

日付だけを比較します。

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

今日かどうかを判定します。

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

13-6. 日付の差分を計算したい

日付同士の差分を取得します。

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

TimeSpan diff = end - start;

Console.WriteLine(diff.Days);

合計時間を取得します。

C#
Console.WriteLine(diff.TotalHours);

合計分を取得します。

C#
Console.WriteLine(diff.TotalMinutes);

13-7. 日付だけ・時刻だけを扱いたい

DateTimeから日付部分だけを取得します。

C#
DateTime date = DateTime.Now.Date;

DateTimeから時刻部分だけを取得します。

C#
TimeSpan time = DateTime.Now.TimeOfDay;

日付だけを表すならDateOnlyを使います。

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

時刻だけを表すならTimeOnlyを使います。

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

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

最後に、C# DateTimeに関するよくある質問をまとめます。

14-1. DateTime.NowとDateTime.UtcNowはどちらを使うべき?

画面表示やローカルアプリで現在時刻を使うだけなら、DateTime.Nowで問題ないことが多いです。

C#
DateTime now = DateTime.Now;

一方、データベース保存、API連携、海外ユーザー対応、サーバー間連携では、DateTime.UtcNowを使う方が安全です。

C#
DateTime utcNow = DateTime.UtcNow;

基本的には、保存はUTC、表示はローカル時刻という方針にすると扱いやすくなります。

C#
DateTime savedAt = DateTime.UtcNow;
DateTime displayTime = savedAt.ToLocalTime();

14-2. DateTimeで日付だけを保存できる?

DateTimeで日付だけを表すことはできます。

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

ただし、DateTimeには必ず時刻部分が含まれます。

この場合、時刻は00:00:00です。

C#
Console.WriteLine(date.ToString("yyyy/MM/dd HH:mm:ss"));
// 2026/01/15 00:00:00

日付だけを明確に扱いたい場合は、DateOnlyを使うのがおすすめです。

C#
DateOnly dateOnly = new DateOnly(2026, 1, 15);

14-3. DateTimeのフォーマットでMMとmmの違いは?

MMは月、mmは分です。

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

Console.WriteLine(date.ToString("yyyy/MM/dd HH:mm"));

出力例です。

C#
2026/01/15 10:05

間違って月にmmを使うと、分が表示されてしまいます。

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

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

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

フォーマット指定では、大文字と小文字の違いが重要です。

14-4. ParseとTryParseはどちらを使うべき?

固定で正しい文字列が入るとわかっている場合は、Parseでも構いません。

C#
DateTime date = DateTime.Parse("2026/01/15");

しかし、ユーザー入力や外部ファイル、APIなど、変換できない可能性がある文字列にはTryParseを使うべきです。

C#
if (DateTime.TryParse("2026/01/15", out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("日付に変換できませんでした");
}

実務では、例外を避けて安全に処理できるTryParseTryParseExactを使う場面が多いです。

14-5. DateTimeとDateTimeOffsetは何が違う?

DateTimeは、日付と時刻を表す型です。

C#
DateTime dateTime = DateTime.Now;

DateTimeOffsetは、日付と時刻に加えて、UTCからのオフセットを持つ型です。

C#
DateTimeOffset dateTimeOffset = DateTimeOffset.Now;

Console.WriteLine(dateTimeOffset);
Console.WriteLine(dateTimeOffset.Offset);

たとえば、日本時間ならUTCとの差は通常+09:00です。

DateTimeOffsetを使うと、その日時がUTCからどれだけずれているかを明確にできます。

API、ログ、海外対応、分散システムでは、DateTimeOffsetの方が適しているケースがあります。

14-6. DateTimeはイミュータブルなの?

DateTimeはイミュータブルです。

つまり、一度作成したDateTimeの値そのものは変更されません。

たとえば、AddDaysを呼び出しても、元の値は変わりません。

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

date.AddDays(1);

Console.WriteLine(date);

このコードでは、dateは元のままです。

結果を使いたい場合は、戻り値を変数に代入します。

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

DateTime nextDay = date.AddDays(1);

Console.WriteLine(nextDay);

または、同じ変数に再代入します。

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

date = date.AddDays(1);

Console.WriteLine(date);

まとめ

C#のDateTimeは、日付と時刻を扱うための基本的で重要な型です。

現在日時を取得するには、DateTime.NowDateTime.TodayDateTime.UtcNowを使います。

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

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

C#
DateTime date = new DateTime(2026, 1, 15);
DateTime dateTime = new DateTime(2026, 1, 15, 10, 30, 0);

文字列に変換するには、ToStringでフォーマットを指定します。

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

文字列から変換するには、ParseTryParseParseExactTryParseExactを使います。

C#
if (DateTime.TryParse("2026/01/15", out DateTime date))
{
Console.WriteLine(date);
}

日付の比較は、比較演算子やCompareCompareToを使います。

C#
if (DateTime.Now > deadline)
{
Console.WriteLine("期限切れです");
}

日付の加算・減算には、AddDaysAddMonthsAddYearsAddHoursなどを使います。

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

日付同士の差分はTimeSpanで取得できます。

C#
TimeSpan diff = end - start;

また、日付だけを扱うならDateOnly、時刻だけを扱うならTimeOnly、タイムゾーンやオフセットを明確に扱いたいならDateTimeOffsetも検討しましょう。

DateTimeは使用頻度が高い分、フォーマット、タイムゾーン、文字列変換、比較方法でミスが起こりやすい型です。

基本的な使い方を押さえたうえで、実務では「日付だけなのか」「時刻も必要なのか」「UTCで保存すべきか」「タイムゾーンを考慮すべきか」を意識して使い分けることが大切です。