C#のnew DateTimeの使い方を完全解説|日付・時刻の初期化とよくあるエラー対策

はじめに

C#で日付や時刻を扱うとき、よく使うのがDateTime型です。その中でもnew DateTime(...)は、特定の日付や時刻を明示的に作成したい場面で欠かせない書き方です。

たとえば、次のように「2026年1月1日」を表すDateTimeを作成できます。

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

一見シンプルですが、new DateTimeには複数のコンストラクタがあり、年月日だけでなく、時分秒、ミリ秒、ticks、UTCやローカル時刻の区別まで指定できます。

また、存在しない日付を指定した場合や、nullを代入しようとした場合にはエラーが発生します。実務では、日付の初期化方法だけでなく、エラーを防ぐ安全な書き方も理解しておくことが重要です。

この記事では、C#のnew DateTimeの基本から、実務で使える初期化例、よくあるエラー、DateOnlyTimeOnlyとの違いまで詳しく解説します。

1. C#のnew DateTimeとは?基本概念と検索ユーザーが知りたいこと

1-1. DateTime構造体の役割

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

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

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

このコードは、2026年6月18日 10時30分00秒を表します。

DateTimeは、誕生日、予約日時、登録日時、検索期間、バッチ処理の基準日など、さまざまな場面で使われます。

.NETの公式ドキュメントでも、DateTimeは日付と時刻の値を表す構造体として定義されています。Microsoft Learn

1-2. new DateTimeでできること

new DateTimeを使うと、任意の日付や時刻を明示的に作成できます。

たとえば、次のような使い方ができます。

C#
DateTime birthday = new DateTime(1990, 5, 20);
DateTime meeting = new DateTime(2026, 6, 18, 14, 0, 0);
DateTime utcTime = new DateTime(2026, 6, 18, 5, 0, 0, DateTimeKind.Utc);

new DateTimeでできる主なことは次のとおりです。

C#
// 日付だけを作成
DateTime date = new DateTime(2026, 1, 1);

// 日付と時刻を作成
DateTime dateTime = new DateTime(2026, 1, 1, 9, 30, 0);

// ミリ秒まで指定
DateTime preciseTime = new DateTime(2026, 1, 1, 9, 30, 0, 500);

// UTCとして作成
DateTime utc = new DateTime(2026, 1, 1, 0, 0, 0, DateTimeKind.Utc);

特定の日付を固定値として扱いたい場合、new DateTimeは非常に便利です。

1-3. 現在日時を取得するDateTime.Nowとの違い

new DateTimeDateTime.Nowは、どちらもDateTime型の値を取得できますが、目的が異なります。

new DateTimeは、指定した日付や時刻を作るために使います。

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

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

C#
DateTime now = DateTime.Now;

たとえば、予約日時や誕生日のように決まった日時を作るならnew DateTime、処理実行時点の日時を取得するならDateTime.Nowを使います。

C#
DateTime reservationDate = new DateTime(2026, 7, 1, 18, 30, 0);
DateTime createdAt = DateTime.Now;

このように、固定日時を作るのがnew DateTime、現在日時を取得するのがDateTime.Nowです。

1-4. DateTime型の初期値とdefault(DateTime)の意味

DateTimeは構造体なので、初期値を持ちます。default(DateTime)new DateTime()を使うと、DateTime.MinValueと同じ値になります。

C#
DateTime defaultValue = default(DateTime);
DateTime newValue = new DateTime();

Console.WriteLine(defaultValue); // 0001/01/01 0:00:00
Console.WriteLine(newValue); // 0001/01/01 0:00:00

つまり、次の3つは実質的に同じ値です。

C#
DateTime value1 = default(DateTime);
DateTime value2 = new DateTime();
DateTime value3 = DateTime.MinValue;

DateTime.MinValueは、DateTimeで表現できる最小値です。未設定の日時として使われることもありますが、実務では本当に「0001年1月1日」を表しているのか、未設定を表しているのかが分かりにくくなる場合があります。

そのため、未設定状態を表したい場合は、後述するDateTime?を使うのが一般的です。

1-5. new DateTimeを使うべきケース

new DateTimeを使うべきケースは、日付や時刻を明示的に指定したい場合です。

たとえば、次のような場面です。

C#
DateTime startDate = new DateTime(2026, 4, 1);
DateTime endDate = new DateTime(2026, 4, 30);
DateTime birthday = new DateTime(1995, 10, 15);
DateTime testNow = new DateTime(2026, 6, 18, 12, 0, 0);

実務では、検索条件の開始日、終了日、テストコードの固定日時、予約日時、キャンペーン期間などでよく使われます。

反対に、現在日時が必要な場合はDateTime.NowDateTime.UtcNowを使います。

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

固定された日付を作るならnew DateTime、現在の日時を取得するならDateTime.NowまたはDateTime.UtcNowと覚えておくとよいでしょう。

2. new DateTimeの基本的な書き方

2-1. 年・月・日を指定して日付を作成する

もっとも基本的な書き方は、年、月、日を指定する方法です。

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

Console.WriteLine(date);

このコードでは、2026年6月18日 0時0分0秒DateTimeが作成されます。

年月日だけを指定した場合、時刻部分は自動的に00:00:00になります。

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

Console.WriteLine(date.Year); // 2026
Console.WriteLine(date.Month); // 6
Console.WriteLine(date.Day); // 18
Console.WriteLine(date.Hour); // 0
Console.WriteLine(date.Minute); // 0
Console.WriteLine(date.Second); // 0

日付だけを扱いたい場合によく使われる書き方です。

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

日付に加えて時刻も指定したい場合は、年、月、日、時、分、秒を指定します。

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

Console.WriteLine(dateTime);

このコードは、2026年6月18日 14時30分00秒を表します。

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

C#
new DateTime(year, month, day, hour, minute, second);

たとえば、予約日時を作る場合は次のように書けます。

C#
DateTime reservationDateTime = new DateTime(2026, 7, 10, 18, 45, 0);

年月日だけでなく、具体的な時刻まで必要な場合に使います。

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

ミリ秒まで指定したい場合は、7つ目の引数にミリ秒を指定します。

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

Console.WriteLine(dateTime);

このコードは、2026年6月18日 14時30分15秒500ミリ秒を表します。

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

C#
new DateTime(year, month, day, hour, minute, second, millisecond);

ミリ秒を指定する例です。

C#
DateTime logTime = new DateTime(2026, 6, 18, 10, 15, 30, 250);

Console.WriteLine(logTime.Millisecond); // 250

ログ、計測処理、外部システムとの連携など、より細かい時刻が必要な場合に使います。

2-4. ticksを指定してDateTimeを作成する

DateTimeは、内部的にticksという単位で日時を管理しています。ticksは、0001年1月1日午前0時からの経過時間を100ナノ秒単位で表した値です。

ticksを指定してDateTimeを作成することもできます。

C#
long ticks = 638858880000000000;
DateTime dateTime = new DateTime(ticks);

Console.WriteLine(dateTime);

ticksを取得するには、Ticksプロパティを使います。

C#
DateTime date = new DateTime(2026, 6, 18);
long ticks = date.Ticks;

Console.WriteLine(ticks);

ticksを使う場面はそれほど多くありませんが、日時を数値として保存したい場合や、低レベルな日時処理を行う場合に使われることがあります。

ただし、通常の業務アプリケーションでは、年月日や時分秒を指定するコンストラクタを使う方が分かりやすいです。

2-5. DateTimeKindを指定してUTC・ローカル時刻を扱う

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

C#
DateTimeKind.Local
DateTimeKind.Utc
DateTimeKind.Unspecified

UTCとして日時を作成する場合は、次のように書きます。

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

Console.WriteLine(utcDateTime.Kind); // Utc

ローカル時刻として作成する場合は、次のように書きます。

C#
DateTime localDateTime = new DateTime(2026, 6, 18, 9, 0, 0, DateTimeKind.Local);

Console.WriteLine(localDateTime.Kind); // Local

DateTimeKindを指定しない場合、多くのコンストラクタではUnspecifiedになります。

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

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

UTCとローカル時刻を区別する必要があるシステムでは、DateTimeKindを明示することが重要です。

3. new DateTimeのコンストラクタ一覧と使い分け

3-1. DateTime(int year, int month, int day)

年月日だけを指定するもっとも基本的なコンストラクタです。

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

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

C#
Console.WriteLine(date);        // 2026/06/18 0:00:00
Console.WriteLine(date.TimeOfDay); // 00:00:00

誕生日、記念日、開始日、終了日など、時刻を意識しない日付を作るときに使います。

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

3-2. DateTime(int year, int month, int day, int hour, int minute, int second)

年月日に加えて、時、分、秒を指定するコンストラクタです。

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

会議、予約、締切、イベント開始時刻など、日時を正確に指定したい場合に使います。

C#
DateTime deadline = new DateTime(2026, 6, 30, 23, 59, 59);

秒まで指定できるため、多くの業務システムではこの形式で十分です。

3-3. DateTime(int year, int month, int day, int hour, int minute, int second, int millisecond)

ミリ秒まで指定するコンストラクタです。

C#
DateTime timestamp = new DateTime(2026, 6, 18, 15, 30, 0, 123);

Millisecondプロパティで指定した値を確認できます。

C#
Console.WriteLine(timestamp.Millisecond); // 123

ログ出力や外部APIとの連携など、ミリ秒単位の精度が必要な場合に使います。

3-4. DateTime(long ticks)

ticksを指定してDateTimeを作成するコンストラクタです。

C#
DateTime original = new DateTime(2026, 6, 18);
long ticks = original.Ticks;

DateTime restored = new DateTime(ticks);

ticksはDateTimeを数値として扱いたい場合に便利です。

C#
Console.WriteLine(original == restored); // True

ただし、コードの可読性は下がりやすいため、通常は年月日や時分秒を指定する書き方を優先します。

3-5. DateTimeKindを含むコンストラクタ

DateTimeKindを指定できるコンストラクタを使うと、その日時がUTCなのか、ローカル時刻なのか、未指定なのかを表現できます。

C#
DateTime utc = new DateTime(2026, 6, 18, 0, 0, 0, DateTimeKind.Utc);
DateTime local = new DateTime(2026, 6, 18, 9, 0, 0, DateTimeKind.Local);
DateTime unspecified = new DateTime(2026, 6, 18, 9, 0, 0, DateTimeKind.Unspecified);

Kindプロパティで確認できます。

C#
Console.WriteLine(utc.Kind);         // Utc
Console.WriteLine(local.Kind); // Local
Console.WriteLine(unspecified.Kind); // Unspecified

タイムゾーン変換を行う処理では、DateTimeKindの指定漏れがバグにつながることがあります。

3-6. カレンダーを指定するコンストラクタ

DateTimeには、Calendarを指定するコンストラクタもあります。

C#
using System;
using System.Globalization;

Calendar calendar = new JapaneseCalendar();
DateTime date = new DateTime(6, 6, 18, calendar);

Console.WriteLine(date);

カレンダーを指定することで、和暦など特定の暦に基づいた日付を扱えます。

ただし、通常の西暦の日付を扱う場合は、カレンダーを指定しないコンストラクタで十分です。業務上、和暦入力や特定文化圏の暦を扱う場合に検討するとよいでしょう。

DateTimeには、年月日、時分秒、ミリ秒、ticks、DateTimeKindCalendarなどを指定する複数のコンストラクタが用意されています。Microsoft Learn

4. new DateTimeを使った日付・時刻の初期化例

4-1. 特定の日付を初期化するサンプルコード

特定の日付を初期化する場合は、年月日を指定します。

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

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

たとえば、キャンペーン開始日を固定で持つ場合は次のように書けます。

C#
DateTime campaignStartDate = new DateTime(2026, 4, 1);

誕生日を表す場合も同じです。

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

時刻を指定しない場合、時刻部分は00:00:00になる点に注意しましょう。

4-2. 特定の時刻を含む日時を初期化するサンプルコード

時刻まで含めたい場合は、年月日、時、分、秒を指定します。

C#
DateTime appointment = new DateTime(2026, 6, 18, 16, 30, 0);

Console.WriteLine(appointment); // 2026/06/18 16:30:00

予約システムでは、次のような使い方ができます。

C#
DateTime reservationDateTime = new DateTime(2026, 7, 5, 19, 0, 0);

締切日時を作る場合は、日付の最後の時刻を指定することもあります。

C#
DateTime deadline = new DateTime(2026, 7, 31, 23, 59, 59);

ただし、ミリ秒以下を含むデータと比較する場合、23:59:59ではその秒の後半が含まれないことがあります。検索条件では、終了日時を「翌日の0時未満」として扱う方法が安全です。

C#
DateTime start = new DateTime(2026, 7, 1);
DateTime exclusiveEnd = new DateTime(2026, 8, 1);

// date >= start && date < exclusiveEnd

4-3. 今日の日付と任意の時刻を組み合わせる方法

今日の日付に任意の時刻を組み合わせたい場合は、DateTime.TodayDateプロパティを使います。

C#
DateTime todayAtNine = DateTime.Today.AddHours(9);

Console.WriteLine(todayAtNine);

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

任意の時刻を加える場合は、AddHoursAddMinutesを使えます。

C#
DateTime todayAtTenThirty = DateTime.Today.AddHours(10).AddMinutes(30);

または、今日の年月日を使ってnew DateTimeで作成することもできます。

C#
DateTime today = DateTime.Today;

DateTime todayAt18 = new DateTime(
today.Year,
today.Month,
today.Day,
18,
0,
0
);

日付と時刻を明示的に組み合わせたい場合は、この書き方が分かりやすいです。

4-4. 月初・月末の日付を作成する方法

月初の日付は、日を1にすれば作成できます。

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

DateTime firstDayOfMonth = new DateTime(target.Year, target.Month, 1);

Console.WriteLine(firstDayOfMonth); // 2026/06/01 0:00:00

月末の日付は、DateTime.DaysInMonthを使うと安全です。

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

int lastDay = DateTime.DaysInMonth(target.Year, target.Month);
DateTime lastDayOfMonth = new DateTime(target.Year, target.Month, lastDay);

Console.WriteLine(lastDayOfMonth); // 2026/06/30 0:00:00

2月やうるう年を考慮する必要があるため、月末日を固定値で書くのは避けましょう。

C#
int daysInFebruary2024 = DateTime.DaysInMonth(2024, 2);
Console.WriteLine(daysInFebruary2024); // 29

DaysInMonthは、指定した年と月の日数を返すメソッドです。Microsoft Learn

4-5. 日付だけを扱いたい場合の書き方

DateTimeで日付だけを扱いたい場合は、年月日だけを指定します。

C#
DateTime dateOnlyLike = new DateTime(2026, 6, 18);

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

C#
Console.WriteLine(dateOnlyLike.TimeOfDay); // 00:00:00

既存のDateTimeから日付部分だけを取り出す場合は、Dateプロパティを使います。

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

ただし、DateTimeはあくまで日付と時刻を持つ型です。日付だけを明確に表したい場合は、.NET 6以降で使えるDateOnlyも選択肢になります。

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

4-6. 時刻だけを扱いたい場合の注意点

DateTimeで時刻だけを扱いたい場合、実際には日付部分も必ず含まれます。

たとえば、9時30分を表したい場合に次のように書くことはできます。

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

しかし、この値は「0001年1月1日 9時30分」を表します。純粋な時刻だけではありません。

時刻だけを扱いたい場合は、TimeSpanまたは.NET 6以降のTimeOnlyを使う方が適していることがあります。

C#
TimeOnly timeOnly = new TimeOnly(9, 30);

特に、営業時間、アラーム時刻、毎日の実行時刻のように日付を持たない時刻を表す場合は、TimeOnlyの利用を検討しましょう。

5. new DateTimeと関連プロパティ・メソッドの使い方

5-1. Year・Month・Dayで年月日を取得する

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

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

Console.WriteLine(date.Year); // 2026
Console.WriteLine(date.Month); // 6
Console.WriteLine(date.Day); // 18

画面表示や条件分岐で、年月日を個別に扱いたい場合に便利です。

C#
if (date.Month == 1)
{
Console.WriteLine("1月です");
}

年月を組み合わせて表示することもできます。

C#
string yearMonth = $"{date.Year}年{date.Month}月";
Console.WriteLine(yearMonth);

5-2. Hour・Minute・Secondで時刻を取得する

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

C#
DateTime dateTime = new DateTime(2026, 6, 18, 14, 30, 45);

Console.WriteLine(dateTime.Hour); // 14
Console.WriteLine(dateTime.Minute); // 30
Console.WriteLine(dateTime.Second); // 45

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

C#
DateTime now = DateTime.Now;

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

ただし、時刻範囲の判定では分や秒も考慮する必要がある場合があります。その場合はTimeOfDayを使うと便利です。

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

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

5-3. AddDays・AddMonths・AddYearsで日付を加算する

DateTimeの日付を加算するには、AddDaysAddMonthsAddYearsなどを使います。

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

DateTime nextDay = date.AddDays(1);
DateTime nextMonth = date.AddMonths(1);
DateTime nextYear = date.AddYears(1);

結果を表示すると、次のようになります。

C#
Console.WriteLine(nextDay);   // 2026/06/19
Console.WriteLine(nextMonth); // 2026/07/18
Console.WriteLine(nextYear); // 2027/06/18

DateTimeは不変の値型なので、AddDaysを呼び出しても元の値は変更されません。

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

Console.WriteLine(date); // 2026/06/18

変更後の値を使うには、戻り値を変数に代入します。

C#
date = date.AddDays(1);

Console.WriteLine(date); // 2026/06/19

5-4. ToStringで日付を文字列に変換する

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

C#
DateTime date = new DateTime(2026, 6, 18, 14, 30, 0);

string text = date.ToString();
Console.WriteLine(text);

書式を指定することもできます。

C#
Console.WriteLine(date.ToString("yyyy/MM/dd"));          // 2026/06/18
Console.WriteLine(date.ToString("yyyy-MM-dd")); // 2026-06-18
Console.WriteLine(date.ToString("yyyy/MM/dd HH:mm:ss")); // 2026/06/18 14:30:00

よく使う書式は次のとおりです。

C#
DateTime dateTime = new DateTime(2026, 6, 18, 14, 30, 5);

Console.WriteLine(dateTime.ToString("yyyyMMdd")); // 20260618
Console.WriteLine(dateTime.ToString("yyyy年M月d日")); // 2026年6月18日
Console.WriteLine(dateTime.ToString("HH:mm")); // 14:30
Console.WriteLine(dateTime.ToString("yyyy-MM-ddTHH:mm:ss")); // 2026-06-18T14:30:05

文字列変換では、カルチャによって表示形式が変わる場合があります。固定フォーマットが必要な場合は、書式文字列を明示しましょう。

5-5. Parse・TryParseで文字列からDateTimeを作成する

文字列からDateTimeを作成するには、DateTime.ParseまたはDateTime.TryParseを使います。

C#
DateTime date = DateTime.Parse("2026/06/18");

Console.WriteLine(date);

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

C#
DateTime date = DateTime.Parse("invalid date"); // 例外

安全に変換したい場合は、TryParseを使います。

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

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

ユーザー入力や外部データを扱う場合は、TryParseを使うのが安全です。

5-6. Dateプロパティで時刻を切り捨てる

DateTimeから時刻部分を切り捨てて日付だけにしたい場合は、Dateプロパティを使います。

C#
DateTime dateTime = new DateTime(2026, 6, 18, 14, 30, 0);
DateTime dateOnly = dateTime.Date;

Console.WriteLine(dateOnly); // 2026/06/18 0:00:00

Dateプロパティを使うと、年月日はそのままで、時刻部分が00:00:00になります。

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

C#
DateTime inputDateTime = new DateTime(2026, 6, 18, 14, 30, 0);
DateTime targetDate = new DateTime(2026, 6, 18);

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

ただし、日付だけを扱う目的であれば、.NET 6以降ではDateOnlyも検討できます。

6. new DateTimeでよくあるエラーと原因

6-1. 年・月・日の範囲外指定によるArgumentOutOfRangeException

new DateTimeでは、指定できる年月日に範囲があります。範囲外の値を指定すると、ArgumentOutOfRangeExceptionが発生します。

たとえば、月に13を指定するとエラーになります。

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

日付の値も範囲外だとエラーです。

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

6月は30日までなので、6月31日は存在しません。

年についても、DateTimeで扱える範囲外の値は指定できません。

C#
DateTime date = new DateTime(0, 1, 1); // エラー

DateTimeの範囲は、DateTime.MinValueからDateTime.MaxValueまでです。

C#
Console.WriteLine(DateTime.MinValue); // 0001/01/01 0:00:00
Console.WriteLine(DateTime.MaxValue); // 9999/12/31 23:59:59

6-2. 存在しない日付を指定した場合のエラー

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

代表的な例は、2月30日です。

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

また、うるう年ではない年の2月29日もエラーになります。

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

一方、2024年はうるう年なので、次のコードは有効です。

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

月末日を作る場合は、DateTime.DaysInMonthを使うと安全です。

C#
int lastDay = DateTime.DaysInMonth(2026, 2);
DateTime endOfMonth = new DateTime(2026, 2, lastDay);

6-3. 時・分・秒の範囲外指定によるエラー

時、分、秒にも指定できる範囲があります。

時は0から23までです。24は指定できません。

C#
DateTime dateTime = new DateTime(2026, 6, 18, 24, 0, 0);

分と秒は0から59までです。

C#
DateTime invalidMinute = new DateTime(2026, 6, 18, 10, 60, 0);
DateTime invalidSecond = new DateTime(2026, 6, 18, 10, 30, 60);

ミリ秒は0から999までです。

C#
DateTime invalidMillisecond = new DateTime(2026, 6, 18, 10, 30, 0, 1000);

範囲外の値を指定すると例外が発生するため、ユーザー入力から日時を作る場合は事前にチェックしましょう。

6-4. DateTime.MinValueより前の日付を扱えない問題

DateTimeで扱える最小値は0001年1月1日 00:00:00です。

C#
DateTime min = DateTime.MinValue;

この値より前の日付は扱えません。

たとえば、DateTime.MinValueから1日引くとエラーになります。

C#
DateTime min = DateTime.MinValue;
DateTime invalid = min.AddDays(-1);

古い歴史的日付や、特殊な業務データを扱う場合は注意が必要です。

また、未設定の意味でDateTime.MinValueを使っている場合、日付計算で意図せず範囲外になることがあります。

C#
DateTime value = DateTime.MinValue;

// 未設定のつもりで加減算すると危険
DateTime before = value.AddDays(-1);

未設定状態にはDateTime?を使う方が安全です。

6-5. nullを代入できないことによるエラー

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

C#
DateTime date = null; // コンパイルエラー

未設定を表したい場合は、Nullable型のDateTime?を使います。

C#
DateTime? date = null;

値があるかどうかは、HasValueで確認できます。

C#
DateTime? date = null;

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

また、次のように比較することもできます。

C#
if (date == null)
{
Console.WriteLine("nullです");
}

6-6. DateTimeKind未指定によるタイムゾーンの誤解

new DateTime(2026, 6, 18, 9, 0, 0)のようにDateTimeKindを指定しない場合、KindUnspecifiedになります。

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

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

Unspecifiedは、UTCなのかローカル時刻なのかが明示されていない状態です。

この状態でタイムゾーン変換を行うと、想定と異なる結果になることがあります。

C#
DateTime unspecified = new DateTime(2026, 6, 18, 9, 0, 0);
DateTime utc = unspecified.ToUniversalTime();

UTCとして扱いたい場合は、最初からDateTimeKind.Utcを指定します。

C#
DateTime utc = new DateTime(2026, 6, 18, 0, 0, 0, DateTimeKind.Utc);

ローカル時刻として扱いたい場合は、DateTimeKind.Localを指定します。

C#
DateTime local = new DateTime(2026, 6, 18, 9, 0, 0, DateTimeKind.Local);

7. new DateTimeのエラー対策と安全な実装方法

7-1. DateTime.DaysInMonthで月末日を確認する

月末日を作るときに、日を固定で31にするとエラーになる可能性があります。

C#
DateTime invalid = new DateTime(2026, 4, 31);

4月は30日までなので、このコードはエラーになります。

安全に月末日を作るには、DateTime.DaysInMonthを使います。

C#
int year = 2026;
int month = 4;

int lastDay = DateTime.DaysInMonth(year, month);
DateTime endOfMonth = new DateTime(year, month, lastDay);

Console.WriteLine(endOfMonth); // 2026/04/30

2月の月末も安全に取得できます。

C#
int year = 2024;
int month = 2;

int lastDay = DateTime.DaysInMonth(year, month);
DateTime endOfFebruary = new DateTime(year, month, lastDay);

Console.WriteLine(endOfFebruary); // 2024/02/29

うるう年を自分で判定するより、DaysInMonthを使う方が簡潔で安全です。

7-2. TryParseを使って安全に日付変換する

ユーザー入力から日付を作る場合、DateTime.ParseではなくDateTime.TryParseを使うと安全です。

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

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

TryParseは、変換に失敗しても例外を投げません。戻り値のtrueまたはfalseで成功したかどうかを判定できます。

不正な入力の例です。

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

if (!DateTime.TryParse(input, out DateTime date))
{
Console.WriteLine("存在しない日付です");
}

WebフォームやCSV取り込みなど、外部から受け取る日付文字列は必ず不正値を想定して処理しましょう。

7-3. Nullable<DateTime>を使って未設定状態を表現する

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

C#
DateTime? publishedAt = null;

値を設定する場合は、通常のDateTimeを代入できます。

C#
publishedAt = new DateTime(2026, 6, 18);

値がある場合だけ処理する例です。

C#
if (publishedAt.HasValue)
{
Console.WriteLine(publishedAt.Value.ToString("yyyy/MM/dd"));
}
else
{
Console.WriteLine("公開日は未設定です");
}

DateTime.MinValueを未設定として扱う方法もありますが、実際の日付と区別しにくくなるため、DateTime?の方が意図が明確です。

C#
DateTime? reservedAt = null;

if (reservedAt == null)
{
Console.WriteLine("予約日時は未定です");
}

7-4. DateTimeKindを明示してUTC・ローカル時刻を区別する

システム内でUTCを使う場合は、DateTimeKind.Utcを明示しましょう。

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

ローカル時刻として扱う場合は、DateTimeKind.Localを指定します。

C#
DateTime localDateTime = new DateTime(2026, 6, 18, 9, 0, 0, DateTimeKind.Local);

Kindを確認する例です。

C#
Console.WriteLine(utcDateTime.Kind);   // Utc
Console.WriteLine(localDateTime.Kind); // Local

UTC保存、ローカル表示の方針を取る場合は、次のように変換できます。

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

逆に、ローカル時刻をUTCに変換する場合は次のように書きます。

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

ただし、KindUnspecifiedの場合は変換結果を誤解しやすいため注意が必要です。

7-5. 入力値をバリデーションして例外を防ぐ

new DateTimeに渡す年月日や時分秒がユーザー入力の場合、事前に範囲をチェックすると安全です。

C#
int year = 2026;
int month = 6;
int day = 18;

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

時刻もチェックする場合は、次のように書けます。

C#
int hour = 14;
int minute = 30;
int second = 0;

bool isValidTime =
hour >= 0 && hour <= 23 &&
minute >= 0 && minute <= 59 &&
second >= 0 && second <= 59;

if (isValidTime)
{
DateTime dateTime = new DateTime(2026, 6, 18, hour, minute, second);
}

例外が発生してから対応するより、事前にバリデーションする方がユーザーに分かりやすいエラーメッセージを返せます。

7-6. 例外処理で不正な日付指定に対応する

どうしてもnew DateTimeで例外が発生する可能性がある場合は、try-catchで処理します。

C#
try
{
DateTime date = new DateTime(2026, 2, 30);
Console.WriteLine(date);
}
catch (ArgumentOutOfRangeException)
{
Console.WriteLine("指定された日付は存在しません");
}

ユーザー入力を直接使う場合は、例外処理だけに頼るのではなく、バリデーションと組み合わせると安全です。

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

DateTime date = new DateTime(year, month, day);
Console.WriteLine(date);
}
catch (ArgumentOutOfRangeException ex)
{
Console.WriteLine($"日付の指定が不正です: {ex.Message}");
}

ただし、通常の入力チェックで防げるエラーは、DaysInMonthや範囲チェックで事前に防ぐ方が望ましいです。

8. new DateTimeとDateOnly・TimeOnlyの違い

8-1. DateOnlyとは何か

DateOnlyは、日付だけを表すための型です。.NET 6以降で利用できます。

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

DateTimeは日付と時刻の両方を持ちますが、DateOnlyは時刻を持ちません。

C#
DateTime dateTime = new DateTime(2026, 6, 18); // 2026/06/18 00:00:00
DateOnly dateOnly = new DateOnly(2026, 6, 18); // 2026/06/18

誕生日、記念日、営業日、締切日など、時刻が不要なデータにはDateOnlyが適している場合があります。

Microsoftのドキュメントでも、DateOnlyは時刻のない特定の日付を表す構造体として説明されています。Microsoft Learn

8-2. TimeOnlyとは何か

TimeOnlyは、時刻だけを表すための型です。こちらも.NET 6以降で利用できます。

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

DateTimeで時刻だけを扱おうとすると、日付部分も必ず含まれます。

C#
DateTime timeLike = new DateTime(1, 1, 1, 9, 30, 0);

一方、TimeOnlyは日付を持たず、純粋に時刻だけを表せます。

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

営業時間、毎日の通知時刻、アラーム時刻などに向いています。TimeOnlyは、時計で読むような1日の時刻を表す型です。Microsoft Learn

8-3. 日付だけならDateOnlyを使うべきケース

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

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

C#
DateOnly birthday = new DateOnly(1990, 5, 20);
DateOnly anniversary = new DateOnly(2026, 6, 18);
DateOnly businessDate = new DateOnly(2026, 4, 1);

DateTimeで日付だけを扱うこともできます。

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

しかし、DateTimeには時刻部分が含まれるため、意図しない比較ミスが起こることがあります。

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

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

日付だけを比較したいなら、DateOnlyの方が意味が明確です。

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

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

8-4. 時刻だけならTimeOnlyを使うべきケース

時刻だけを扱いたい場合は、TimeOnlyが適しています。

たとえば、営業時間を表す場合です。

C#
TimeOnly open = new TimeOnly(9, 0);
TimeOnly close = new TimeOnly(18, 0);

毎日同じ時刻に処理するバッチの実行時刻も、TimeOnlyで表せます。

C#
TimeOnly batchTime = new TimeOnly(2, 30);

DateTimeで書くと、日付部分が不要なのに含まれてしまいます。

C#
DateTime batchTime = new DateTime(1, 1, 1, 2, 30, 0);

このような場合は、TimeOnlyを使う方がコードの意図が分かりやすくなります。

8-5. DateTimeを使い続けるべきケース

DateOnlyTimeOnlyが便利でも、すべてを置き換える必要はありません。日付と時刻をセットで扱う場合は、引き続きDateTimeが適しています。

たとえば、次のようなケースです。

C#
DateTime createdAt = DateTime.Now;
DateTime reservedAt = new DateTime(2026, 6, 18, 19, 30, 0);
DateTime executedAt = DateTime.UtcNow;

登録日時、更新日時、予約日時、ログの発生日時、バッチ実行日時などは、日付と時刻の両方が必要です。

また、既存のライブラリやデータベースがDateTimeを前提としている場合も、DateTimeを使い続ける方が自然です。

C#
public class Reservation
{
public DateTime ReservedAt { get; set; }
}

日付だけならDateOnly、時刻だけならTimeOnly、日時ならDateTimeという使い分けが基本です。

8-6. DateOnly・TimeOnlyとDateTimeの相互変換

DateOnlyTimeOnlyを組み合わせて、DateTimeに変換できます。

C#
DateOnly date = new DateOnly(2026, 6, 18);
TimeOnly time = new TimeOnly(14, 30);

DateTime dateTime = date.ToDateTime(time);

Console.WriteLine(dateTime); // 2026/06/18 14:30:00

DateTimeKindを指定することもできます。

C#
DateTime utcDateTime = date.ToDateTime(time, DateTimeKind.Utc);

DateTimeからDateOnlyTimeOnlyを作る場合は、次のように書けます。

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

DateOnly dateOnly = DateOnly.FromDateTime(dateTime);
TimeOnly timeOnly = TimeOnly.FromDateTime(dateTime);

DateOnly.ToDateTimeは、指定した日付と時刻をもとにDateTimeを返すメソッドです。Microsoft Learn

9. 実務で使えるnew DateTimeの活用パターン

9-1. 誕生日や記念日を登録する

誕生日や記念日は、年月日を指定して作成できます。

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

ユーザー情報のクラスに持たせる例です。

C#
public class User
{
public string Name { get; set; }
public DateTime Birthday { get; set; }
}

初期化例です。

C#
User user = new User
{
Name = "Taro",
Birthday = new DateTime(1990, 5, 20)
};

ただし、誕生日には通常、時刻は不要です。.NET 6以降であれば、DateOnlyを使う選択肢もあります。

C#
public class User
{
public string Name { get; set; }
public DateOnly Birthday { get; set; }
}

既存システムやデータベース都合でDateTimeを使う場合は、時刻部分を00:00:00として扱うルールを決めておくとよいでしょう。

9-2. 予約日時を作成する

予約日時は、日付と時刻の両方が必要なのでDateTimeが適しています。

C#
DateTime reservedAt = new DateTime(2026, 7, 10, 18, 30, 0);

予約情報のクラス例です。

C#
public class Reservation
{
public int Id { get; set; }
public DateTime ReservedAt { get; set; }
}

初期化例です。

C#
Reservation reservation = new Reservation
{
Id = 1,
ReservedAt = new DateTime(2026, 7, 10, 18, 30, 0)
};

予約日時をUTCで保存する方針の場合は、DateTimeKind.Utcを指定します。

C#
DateTime reservedAtUtc = new DateTime(2026, 7, 10, 9, 30, 0, DateTimeKind.Utc);

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

C#
DateTime localTime = reservedAtUtc.ToLocalTime();

9-3. 検索条件の開始日・終了日を作成する

検索条件で期間を指定する場合、new DateTimeはよく使われます。

C#
DateTime startDate = new DateTime(2026, 6, 1);
DateTime endDate = new DateTime(2026, 7, 1);

6月中のデータを検索する場合は、次のように「開始日以上、翌月初日未満」で判定すると安全です。

C#
DateTime start = new DateTime(2026, 6, 1);
DateTime endExclusive = new DateTime(2026, 7, 1);

// target >= start && target < endExclusive

23:59:59を終了日時にすると、ミリ秒以下のデータが漏れる可能性があります。

C#
DateTime end = new DateTime(2026, 6, 30, 23, 59, 59);

そのため、実務では終了日を含めたい場合でも、内部的には翌日の0時未満で判定する方法がよく使われます。

C#
DateTime start = new DateTime(2026, 6, 1);
DateTime endExclusive = new DateTime(2026, 7, 1);

bool isInRange = target >= start && target < endExclusive;

9-4. バッチ処理の基準日を指定する

バッチ処理では、処理対象日や基準日をnew DateTimeで固定することがあります。

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

たとえば、月次処理の対象月を作る場合です。

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

月初から翌月初までを対象範囲にできます。

C#
DateTime from = new DateTime(2026, 6, 1);
DateTime to = from.AddMonths(1);

// from <= date && date < to

日次バッチで前日分を処理する場合は、現在日付から計算することもあります。

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

テストや再実行では、固定日時をnew DateTimeで指定すると処理結果を再現しやすくなります。

9-5. テストコードで固定日時を使う

テストコードでは、DateTime.Nowを直接使うと実行時刻によって結果が変わってしまいます。

C#
DateTime now = DateTime.Now;

テストでは、固定日時をnew DateTimeで作ると安定します。

C#
DateTime fixedNow = new DateTime(2026, 6, 18, 12, 0, 0);

たとえば、期限切れ判定のテストです。

C#
DateTime now = new DateTime(2026, 6, 18);
DateTime dueDate = new DateTime(2026, 6, 17);

bool isExpired = dueDate < now;

Console.WriteLine(isExpired); // True

実務では、現在日時を直接呼び出すのではなく、日時取得用のインターフェースを用意することもあります。

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

テスト用の実装では、固定日時を返します。

C#
public class FixedClock : IClock
{
public DateTime Now => new DateTime(2026, 6, 18, 12, 0, 0);
}

9-6. データベース保存時の日時初期化

データベースに保存する日時を初期化する場合、作成日時や更新日時には現在日時を使うことが多いです。

C#
DateTime createdAt = DateTime.UtcNow;

一方、業務上決まった日付を保存する場合は、new DateTimeを使います。

C#
DateTime contractStartDate = new DateTime(2026, 4, 1);
DateTime contractEndDate = new DateTime(2027, 3, 31);

Entityの例です。

C#
public class Contract
{
public int Id { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public DateTime CreatedAt { get; set; }
}

初期化例です。

C#
Contract contract = new Contract
{
StartDate = new DateTime(2026, 4, 1),
EndDate = new DateTime(2027, 3, 31),
CreatedAt = DateTime.UtcNow
};

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

10. new DateTimeを使うときの注意点

10-1. DateTimeは不変オブジェクトである

DateTimeは不変です。つまり、一度作成したDateTimeの値自体は変更されません。

たとえば、AddDaysを呼び出しても、元の変数は自動的には変わりません。

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

date.AddDays(1);

Console.WriteLine(date); // 2026/06/18

加算後の値を使うには、戻り値を代入する必要があります。

C#
date = date.AddDays(1);

Console.WriteLine(date); // 2026/06/19

これはAddMonthsAddYearsでも同じです。

C#
DateTime nextMonth = date.AddMonths(1);
DateTime nextYear = date.AddYears(1);

DateTimeのメソッドは、元の値を変更するのではなく、新しいDateTimeを返すと理解しておきましょう。

10-2. 月や日の値は1始まりで指定する

new DateTimeでは、月や日は1始まりで指定します。

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

month1を指定すると1月、12を指定すると12月です。

C#
DateTime january = new DateTime(2026, 1, 1);
DateTime december = new DateTime(2026, 12, 1);

プログラミングでは配列のインデックスが0始まりなので、月も0始まりと勘違いすることがあります。

次のコードはエラーです。

C#
DateTime invalid = new DateTime(2026, 0, 1);

日は1から始まります。0日は存在しません。

C#
DateTime invalid = new DateTime(2026, 6, 0);

年月日は、実際のカレンダーと同じ感覚で指定すると覚えておきましょう。

10-3. タイムゾーン変換には注意する

DateTimeKindが曖昧なままタイムゾーン変換を行うと、想定と異なる結果になることがあります。

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

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

UTCとして扱いたい場合は、DateTimeKind.Utcを指定します。

C#
DateTime utc = new DateTime(2026, 6, 18, 0, 0, 0, DateTimeKind.Utc);

ローカル時刻として扱いたい場合は、DateTimeKind.Localを指定します。

C#
DateTime local = new DateTime(2026, 6, 18, 9, 0, 0, DateTimeKind.Local);

また、タイムゾーンのオフセットを明確に扱いたい場合は、DateTimeOffsetも検討できます。DateTimeKindはUTC、ローカル、未指定を表せますが、DateTimeOffsetはUTCからのオフセットを保持できます。Microsoft Learn

10-4. 日付比較では時刻部分も考慮する

DateTimeを比較するときは、時刻部分も含めて比較されます。

C#
DateTime a = new DateTime(2026, 6, 18, 0, 0, 0);
DateTime b = new DateTime(2026, 6, 18, 12, 0, 0);

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

同じ日付かどうかだけを判定したい場合は、Dateプロパティを使います。

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

検索条件でも時刻部分に注意が必要です。

C#
DateTime start = new DateTime(2026, 6, 18);
DateTime end = new DateTime(2026, 6, 19);

bool isTargetDate = target >= start && target < end;

日付だけを扱っているつもりでも、DateTimeには必ず時刻が含まれます。比較処理ではこの点を意識しましょう。

10-5. 文字列変換ではカルチャ設定に注意する

DateTime.ToString()の結果は、実行環境のカルチャ設定によって変わることがあります。

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

Console.WriteLine(date.ToString());

日本語環境と英語環境で表示形式が異なる場合があります。

固定の形式で出力したい場合は、書式を明示します。

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

日時まで出力する場合です。

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

APIやファイル出力など、他システムと連携するデータでは、環境依存の表示形式を避けることが重要です。

C#
DateTime dateTime = new DateTime(2026, 6, 18, 14, 30, 0);
string formatted = dateTime.ToString("yyyy-MM-ddTHH:mm:ss");

必要に応じて、CultureInfo.InvariantCultureを使うこともあります。

C#
using System.Globalization;

string formatted = dateTime.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);

10-6. UTC保存とローカル表示を分けて考える

複数の地域やタイムゾーンを扱うシステムでは、日時の保存と表示を分けて考えることが重要です。

よくある方針は、データベースにはUTCで保存し、画面表示時にユーザーのローカル時刻へ変換する方法です。

C#
DateTime createdAtUtc = DateTime.UtcNow;

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

C#
DateTime localTime = createdAtUtc.ToLocalTime();

固定日時をUTCで作る場合は、DateTimeKind.Utcを指定します。

C#
DateTime scheduledAtUtc = new DateTime(2026, 6, 18, 0, 0, 0, DateTimeKind.Utc);

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

C#
Console.WriteLine(scheduledAtUtc.ToLocalTime().ToString("yyyy/MM/dd HH:mm:ss"));

UTCとローカル時刻を混在させると、日時がずれる原因になります。保存形式、内部処理、表示形式のルールを明確にしておきましょう。

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

11-1. new DateTime()の値は何になる?

new DateTime()の値は、DateTime.MinValueと同じです。

C#
DateTime date = new DateTime();

Console.WriteLine(date); // 0001/01/01 0:00:00

次の3つは同じ意味で使われます。

C#
DateTime a = new DateTime();
DateTime b = default(DateTime);
DateTime c = DateTime.MinValue;

未設定の日時を表すためにnew DateTime()DateTime.MinValueを使うこともありますが、実務ではDateTime?を使う方が意図が明確です。

C#
DateTime? date = null;

11-2. new DateTimeとDateTime.Nowの違いは?

new DateTimeは、指定した日付や時刻を作るために使います。

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

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

C#
DateTime now = DateTime.Now;

固定された日付を作るならnew DateTime、処理を実行した現在時刻を取得するならDateTime.Nowを使います。

UTCの現在日時が必要な場合は、DateTime.UtcNowを使います。

C#
DateTime utcNow = DateTime.UtcNow;

11-3. DateTimeにnullを入れるにはどうすればいい?

通常のDateTimeにはnullを入れられません。

C#
DateTime date = null; // コンパイルエラー

nullを許可したい場合は、Nullable型のDateTime?を使います。

C#
DateTime? date = null;

値を入れることもできます。

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

値があるかどうかを確認するには、次のように書きます。

C#
if (date.HasValue)
{
Console.WriteLine(date.Value);
}
else
{
Console.WriteLine("未設定です");
}

シンプルにnull比較もできます。

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

11-4. 日付だけを作成するにはどう書く?

DateTimeで日付だけを作成するには、年月日だけを指定します。

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

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

C#
Console.WriteLine(date); // 2026/06/18 0:00:00

日付だけを明確に扱いたい場合は、.NET 6以降のDateOnlyも使えます。

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

既存システムやライブラリがDateTimeを使っている場合はDateTime、純粋な日付だけを表したい場合はDateOnlyを検討するとよいでしょう。

11-5. 存在しない日付を指定するとどうなる?

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

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

2月30日は存在しないためエラーになります。

うるう年ではない年の2月29日もエラーです。

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

月末日を作る場合は、DateTime.DaysInMonthを使いましょう。

C#
int year = 2026;
int month = 2;
int lastDay = DateTime.DaysInMonth(year, month);

DateTime endOfMonth = new DateTime(year, month, lastDay);

これにより、2月やうるう年も安全に処理できます。

11-6. UTCのDateTimeを作るにはどうすればいい?

UTCのDateTimeを作るには、DateTimeKind.Utcを指定します。

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

Kindプロパティで確認できます。

C#
Console.WriteLine(utcDateTime.Kind); // Utc

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

C#
DateTime utcNow = DateTime.UtcNow;

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

C#
DateTime localTime = utcDateTime.ToLocalTime();

UTC保存とローカル表示を分けることで、タイムゾーンによる日時のずれを防ぎやすくなります。

まとめ

C#のnew DateTimeは、特定の日付や時刻を明示的に作成するための基本的な書き方です。

年月日だけを指定する場合は、次のように書きます。

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

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

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

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

C#
DateTime utc = new DateTime(2026, 6, 18, 0, 0, 0, DateTimeKind.Utc);

new DateTimeを使うときは、存在しない日付、範囲外の年月日、時分秒の指定ミスに注意が必要です。

C#
DateTime invalid = new DateTime(2026, 2, 30); // エラー

月末日を作る場合は、DateTime.DaysInMonthを使うと安全です。

C#
int lastDay = DateTime.DaysInMonth(2026, 2);
DateTime endOfMonth = new DateTime(2026, 2, lastDay);

また、DateTimeは通常nullを代入できないため、未設定を表したい場合はDateTime?を使います。

C#
DateTime? date = null;

日付だけを扱うならDateOnly、時刻だけを扱うならTimeOnly、日付と時刻をセットで扱うならDateTimeを使うのが基本です。

new DateTimeはシンプルな構文ですが、日時処理の基礎となる重要な機能です。コンストラクタの使い分け、エラー対策、タイムゾーンの扱いを理解しておくことで、実務でも安全で分かりやすい日付処理を書けるようになります。