【C# DateTimePicker】使い方を初心者向けに解説|日付取得・表示形式・初期値・変更イベントまで

はじめに

C#でWindows Formsアプリを作っていると、日付を入力させたい場面はよくあります。たとえば、予約日、生年月日、開始日、終了日、納期、検索期間などです。

そのような日付入力に便利なのが、DateTimePickerです。

DateTimePickerを使うと、ユーザーはカレンダーから日付を選択できます。TextBoxに手入力させる場合と比べて、入力ミスを減らしやすく、日付として扱いやすいのが大きなメリットです。

この記事では、C# DateTimePickerの基本的な使い方を初心者向けに解説します。

日付の取得方法、表示形式の変更、初期値の設定、変更イベント、入力範囲の制限、時刻入力、空欄の表現、よくあるエラー、実用サンプルまで順番に見ていきます。

1. C#のDateTimePickerとは?できることと使う場面

1-1. DateTimePickerはWindows Formsで日付・時刻を選択するコントロール

DateTimePickerは、C#のWindows Formsで使える日付・時刻選択用のコントロールです。

画面上に配置すると、ユーザーはカレンダーやスピンボタンを使って日付や時刻を選択できます。

たとえば、フォームにDateTimePickerを配置すると、次のような入力ができます。

C#
2026/06/07

また、表示形式を変更すれば、次のような表示も可能です。

C#
2026年06月07日
14:30
2026/06/07 14:30

DateTimePickerは、見た目は入力欄のように見えますが、内部では日付や時刻をDateTime型として扱います。

そのため、文字列を解析する処理を自分で書かなくても、選択された日付をそのままプログラムで利用できます。

1-2. TextBoxで日付入力する場合との違い

日付入力はTextBoxでも実装できます。

たとえば、TextBoxに次のように入力してもらう方法です。

C#
2026/06/07

しかし、TextBoxの場合はユーザーが自由に文字を入力できるため、次のような問題が起きやすくなります。

C#
2026/99/99
abc
2026年6月7日
06-07-2026

このような入力があると、プログラム側で日付として正しいかどうかをチェックする必要があります。

一方、DateTimePickerを使うと、ユーザーは基本的に日付として有効な値を選択します。そのため、TextBoxよりも入力ミスが少なく、日付処理をシンプルにできます。

TextBoxとDateTimePickerの違いを簡単にまとめると、次のようになります。

項目TextBoxDateTimePicker
入力方法自由入力カレンダーやスピンで選択
入力ミス起きやすい起きにくい
値の型文字列DateTime型
日付チェック自分で必要基本的に不要
業務アプリ向き条件次第向いている

初心者のうちは、日付入力にはTextBoxではなくDateTimePickerを使うと実装しやすいです。

1-3. DateTimePickerで扱える値はDateTime型

DateTimePickerで選択した値は、Valueプロパティから取得します。

C#
DateTime selectedDate = dateTimePicker1.Value;

このとき取得できる値は、文字列ではなくDateTime型です。

DateTime型なので、年、月、日、時、分、秒などを簡単に取り出せます。

C#
int year = dateTimePicker1.Value.Year;
int month = dateTimePicker1.Value.Month;
int day = dateTimePicker1.Value.Day;

表示上は2026/06/07のように見えていても、内部的にはDateTime型の値として管理されています。

これは非常に重要なポイントです。

DateTimePickerの表示形式を変更しても、取得できる値の型はDateTime型のままです。

1-4. DateTimePickerが向いている画面例

DateTimePickerは、日付や時刻を入力するさまざまな画面で使えます。

たとえば、次のような画面に向いています。

画面例入力内容
予約登録画面予約日、予約時刻
顧客登録画面生年月日
勤怠管理画面出勤日、退勤日、出勤時刻
検索画面開始日、終了日
請求管理画面請求日、支払期限
タスク管理画面期限日

特に業務アプリでは、日付の入力ミスがデータ不整合につながることがあります。

DateTimePickerを使うことで、ユーザーにとっても開発者にとっても扱いやすい日付入力画面を作れます。

2. DateTimePickerの基本的な使い方

2-1. フォームにDateTimePickerを配置する手順

Windows FormsでDateTimePickerを使う方法は、大きく分けて2つあります。

1つ目は、Visual Studioのデザイナーから配置する方法です。

2つ目は、C#のコードでDateTimePickerを生成する方法です。

初心者の場合は、まずVisual Studioのデザイナーから配置する方法を覚えるのがおすすめです。

デザイナーで配置すると、位置やサイズをマウス操作で調整できます。また、プロパティウィンドウからNameやFormatなどの設定も変更できます。

2-2. Visual Studioのデザイナーで追加する方法

Visual StudioのWindows FormsプロジェクトでDateTimePickerを追加する手順は次のとおりです。

  1. フォームをデザイナーで開く

  2. ツールボックスを開く

  3. 「DateTimePicker」を探す

  4. フォーム上にドラッグ&ドロップする

  5. プロパティウィンドウでNameなどを設定する

フォームに配置すると、通常は次のような名前が自動で付けられます。

C#
dateTimePicker1

この名前のままでも動作しますが、実務では何の日付を入力するコントロールなのか分かる名前に変更するのがおすすめです。

たとえば、予約日なら次のような名前にします。

C#
dtpReservationDate

生年月日なら次のようにします。

C#
dtpBirthDate

分かりやすい名前を付けることで、コードを読んだときに意味が理解しやすくなります。

2-3. コードからDateTimePickerを生成する方法

DateTimePickerは、デザイナーを使わずにコードから生成することもできます。

C#
DateTimePicker dtp = new DateTimePicker();

dtp.Name = "dtpReservationDate";
dtp.Location = new Point(20, 20);
dtp.Width = 200;
dtp.Format = DateTimePickerFormat.Short;

this.Controls.Add(dtp);

このコードでは、DateTimePickerを作成し、フォーム上の座標、幅、表示形式を設定してから、フォームに追加しています。

コード全体の例は次のようになります。

C#
using System;
using System.Drawing;
using System.Windows.Forms;

namespace DateTimePickerSample
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

DateTimePicker dtp = new DateTimePicker();

dtp.Name = "dtpReservationDate";
dtp.Location = new Point(20, 20);
dtp.Width = 200;
dtp.Format = DateTimePickerFormat.Short;

this.Controls.Add(dtp);
}
}
}

通常の画面作成ではデザイナーを使うことが多いですが、動的にコントロールを追加したい場合はコードから生成する方法も使えます。

2-4. Nameプロパティを分かりやすく設定する

DateTimePickerを使うときは、Nameプロパティを分かりやすく設定しておくことが大切です。

たとえば、次のような名前は意味が分かりにくいです。

C#
dateTimePicker1
dateTimePicker2
dateTimePicker3

画面にDateTimePickerが1つだけなら問題になりにくいですが、開始日、終了日、生年月日、予約日など複数のDateTimePickerがあると、どれが何を表しているのか分かりづらくなります。

おすすめは、用途が分かる名前にすることです。

C#
dtpStartDate
dtpEndDate
dtpBirthDate
dtpReservationDate
dtpPaymentDate

dtpはDateTimePickerの略としてよく使われます。

必ずこの名前にしなければならないわけではありませんが、プロジェクト内で命名ルールを統一しておくと、保守しやすいコードになります。

3. DateTimePickerで選択した日付を取得する方法

3-1. Valueプロパティで日付を取得する

DateTimePickerで選択された日付を取得するには、Valueプロパティを使います。

C#
DateTime selectedDate = dtpReservationDate.Value;

ValueプロパティはDateTime型です。

そのため、取得した値は日付計算や比較、データベース保存などにそのまま使えます。

たとえば、今日より前の日付かどうかを判定する場合は、次のように書けます。

C#
if (dtpReservationDate.Value.Date < DateTime.Today)
{
MessageBox.Show("過去の日付は選択できません。");
}

ここでは、Value.Dateを使って日付部分だけを比較しています。

DateTime型には時刻も含まれるため、日付だけを比較したい場合は.Dateを使うと分かりやすいです。

3-2. DateTime型として取得するサンプルコード

ボタンをクリックしたときに、DateTimePickerの値をDateTime型として取得する例を見てみましょう。

C#
private void btnGetDate_Click(object sender, EventArgs e)
{
DateTime selectedDate = dtpReservationDate.Value;

MessageBox.Show(selectedDate.ToString());
}

このコードでは、dtpReservationDate.Valueから選択された日付を取得し、MessageBoxで表示しています。

表示形式を指定したい場合は、ToStringに書式を指定します。

C#
private void btnGetDate_Click(object sender, EventArgs e)
{
DateTime selectedDate = dtpReservationDate.Value;

MessageBox.Show(selectedDate.ToString("yyyy/MM/dd"));
}

この場合、次のような形式で表示されます。

C#
2026/06/07

3-3. 年・月・日だけを取り出す方法

DateTimePickerの値はDateTime型なので、年、月、日を個別に取り出せます。

C#
private void btnGetDate_Click(object sender, EventArgs e)
{
DateTime selectedDate = dtpReservationDate.Value;

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

MessageBox.Show($"{year}年{month}月{day}日");
}

YearMonthDayを使うと、それぞれ整数として取得できます。

また、曜日を取得したい場合はDayOfWeekを使います。

C#
DayOfWeek dayOfWeek = selectedDate.DayOfWeek;

日本語の曜日として表示したい場合は、次のように書けます。

C#
string[] weeks = { "日", "月", "火", "水", "木", "金", "土" };
string week = weeks[(int)selectedDate.DayOfWeek];

MessageBox.Show($"{selectedDate:yyyy/MM/dd}({week})");

3-4. 文字列として日付を取得する方法

DateTimePickerの値を文字列として取得したい場合は、ToStringを使います。

C#
string dateText = dtpReservationDate.Value.ToString("yyyy/MM/dd");

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

C#
string date1 = dtpReservationDate.Value.ToString("yyyy/MM/dd");
string date2 = dtpReservationDate.Value.ToString("yyyy年MM月dd日");
string date3 = dtpReservationDate.Value.ToString("yyyy-MM-dd");

画面表示やログ出力では文字列に変換して使うことがあります。

ただし、日付計算やデータベース保存では、できるだけDateTime型のまま扱うのがおすすめです。

特にSQL Serverなどに保存する場合、日付を文字列にしてSQL文へ連結するのではなく、パラメータとしてDateTime型を渡す方が安全です。

3-5. ボタンクリック時に日付を取得する実装例

実際によくある実装として、ボタンをクリックしたときにDateTimePickerの日付を取得する例を紹介します。

フォームに次のコントロールがあるとします。

コントロールName
DateTimePickerdtpReservationDate
ButtonbtnShowDate
LabellblSelectedDate

ボタンクリック時のコードは次のようになります。

C#
private void btnShowDate_Click(object sender, EventArgs e)
{
DateTime selectedDate = dtpReservationDate.Value;

lblSelectedDate.Text = selectedDate.ToString("yyyy年MM月dd日");
}

MessageBoxで表示する場合は次のようにします。

C#
private void btnShowDate_Click(object sender, EventArgs e)
{
DateTime selectedDate = dtpReservationDate.Value;

MessageBox.Show($"選択された日付は {selectedDate:yyyy/MM/dd} です。");
}

$"..."は文字列補間と呼ばれる書き方です。

変数や式を文字列の中に埋め込めるため、日付を表示するときにも便利です。

4. DateTimePickerの表示形式を変更する方法

4-1. Formatプロパティの基本

DateTimePickerの表示形式は、Formatプロパティで変更できます。

C#
dtpReservationDate.Format = DateTimePickerFormat.Short;

Formatプロパティには、主に次の値を指定します。

C#
DateTimePickerFormat.Short
DateTimePickerFormat.Long
DateTimePickerFormat.Time
DateTimePickerFormat.Custom

標準的な日付表示でよければShortLongを使います。

自分でyyyy/MM/ddのような形式にしたい場合は、Customを指定して、さらにCustomFormatを設定します。

4-2. Short・Long・Time・Customの違い

DateTimePickerFormatには、主に次の種類があります。

Format説明表示例
Short短い日付形式2026/06/07
Long長い日付形式2026年6月7日
Time時刻形式14:30:00
Custom独自形式2026年06月07日 14:30

実際の表示は、Windowsの地域設定や環境によって変わることがあります。

表示形式を完全に固定したい場合は、Customを使うのがおすすめです。

C#
dtpReservationDate.Format = DateTimePickerFormat.Custom;
dtpReservationDate.CustomFormat = "yyyy/MM/dd";

4-3. yyyy/MM/dd形式で表示する方法

日付をyyyy/MM/dd形式で表示したい場合は、次のように設定します。

C#
dtpReservationDate.Format = DateTimePickerFormat.Custom;
dtpReservationDate.CustomFormat = "yyyy/MM/dd";

表示例は次のようになります。

C#
2026/06/07

業務アプリでは、この形式がよく使われます。

年、月、日の桁数が固定されるため、一覧表示や帳票でも見やすい形式です。

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

日本語表記で表示したい場合は、次のように設定します。

C#
dtpReservationDate.Format = DateTimePickerFormat.Custom;
dtpReservationDate.CustomFormat = "yyyy年MM月dd日";

表示例は次のようになります。

C#
2026年06月07日

月や日を1桁表示にしたい場合は、MMddではなく、Mdを使います。

C#
dtpReservationDate.CustomFormat = "yyyy年M月d日";

表示例は次のようになります。

C#
2026年6月7日

MMは2桁、Mは1桁または2桁で表示されます。

同じように、ddは2桁、dは1桁または2桁です。

4-5. 時刻だけを表示する方法

DateTimePickerで時刻だけを表示したい場合は、FormatTimeを指定します。

C#
dtpTime.Format = DateTimePickerFormat.Time;

ただし、この設定だけだと環境によって秒まで表示されることがあります。

時と分だけにしたい場合は、CustomFormatを使うとよいです。

C#
dtpTime.Format = DateTimePickerFormat.Custom;
dtpTime.CustomFormat = "HH:mm";
dtpTime.ShowUpDown = true;

ShowUpDowntrueにすると、カレンダーではなくスピンボタンで時刻を変更できます。

時刻入力の場合は、ShowUpDown = trueにすることが多いです。

4-6. 日付と時刻を両方表示する方法

日付と時刻を両方表示したい場合は、CustomFormatに日付と時刻の書式を指定します。

C#
dtpDateTime.Format = DateTimePickerFormat.Custom;
dtpDateTime.CustomFormat = "yyyy/MM/dd HH:mm";

表示例は次のようになります。

C#
2026/06/07 14:30

秒まで表示したい場合は、次のようにします。

C#
dtpDateTime.CustomFormat = "yyyy/MM/dd HH:mm:ss";

表示例は次のようになります。

C#
2026/06/07 14:30:00

予約日時や開始日時など、日付と時刻をまとめて入力させたい場合に便利です。

4-7. CustomFormatでよく使う書式一覧

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

書式意味表示例
yyyy西暦4桁2026
yy西暦2桁26
MM月2桁06
M月1桁または2桁6
dd日2桁07
d日1桁または2桁7
HH時2桁、24時間表記14
H時1桁または2桁、24時間表記14
hh時2桁、12時間表記02
mm分2桁30
ss秒2桁00

よく使うCustomFormatの例は次のとおりです。

C#
dtp.CustomFormat = "yyyy/MM/dd";
dtp.CustomFormat = "yyyy年MM月dd日";
dtp.CustomFormat = "yyyy-MM-dd";
dtp.CustomFormat = "HH:mm";
dtp.CustomFormat = "yyyy/MM/dd HH:mm";

注意点として、月は大文字のM、分は小文字のmです。

C#
// 月
"MM"

// 分
"mm"

この違いを間違えると、思った通りの表示になりません。

5. DateTimePickerの初期値を設定する方法

5-1. Valueプロパティで初期値を設定する

DateTimePickerの初期値は、ValueプロパティにDateTime型の値を代入して設定します。

C#
dtpReservationDate.Value = DateTime.Today;

Valueに設定できるのはDateTime型です。

文字列をそのまま代入することはできません。

C#
// エラーになる例
dtpReservationDate.Value = "2026/06/07";

正しくは、次のようにDateTime型の値を代入します。

C#
dtpReservationDate.Value = new DateTime(2026, 6, 7);

または、文字列を日付に変換してから代入します。

C#
dtpReservationDate.Value = DateTime.Parse("2026/06/07");

ただし、固定の日付を設定するだけなら、new DateTime(年, 月, 日)を使う方が分かりやすいです。

5-2. 今日の日付を初期表示する方法

今日の日付を初期表示したい場合は、DateTime.Todayを使います。

C#
dtpReservationDate.Value = DateTime.Today;

DateTime.Todayは、現在の日付を表します。時刻は00:00:00です。

一方、DateTime.Nowは現在の日付と時刻を表します。

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

日付だけを扱うDateTimePickerなら、DateTime.Todayを使うと分かりやすいです。

時刻も扱う場合は、DateTime.Nowを使うことがあります。

C#
dtpDateTime.Value = DateTime.Now;

5-3. 任意の日付を初期値にする方法

任意の日付を初期値にしたい場合は、new DateTimeを使います。

C#
dtpReservationDate.Value = new DateTime(2026, 6, 7);

このコードでは、2026年6月7日を初期値に設定しています。

年月日の指定は次の順番です。

C#
new DateTime(, , )

時刻まで指定したい場合は、次のようにします。

C#
dtpDateTime.Value = new DateTime(2026, 6, 7, 14, 30, 0);

この場合、2026年6月7日 14時30分00秒を設定しています。

C#
new DateTime(, , , , , )

5-4. 画面表示時に初期値を設定する実装例

フォームを表示したタイミングで初期値を設定したい場合は、フォームのLoadイベントを使います。

C#
private void Form1_Load(object sender, EventArgs e)
{
dtpReservationDate.Value = DateTime.Today;
}

表示形式も同時に設定するなら、次のように書けます。

C#
private void Form1_Load(object sender, EventArgs e)
{
dtpReservationDate.Format = DateTimePickerFormat.Custom;
dtpReservationDate.CustomFormat = "yyyy/MM/dd";
dtpReservationDate.Value = DateTime.Today;
}

時刻入力用のDateTimePickerなら、次のように設定できます。

C#
private void Form1_Load(object sender, EventArgs e)
{
dtpStartTime.Format = DateTimePickerFormat.Custom;
dtpStartTime.CustomFormat = "HH:mm";
dtpStartTime.ShowUpDown = true;
dtpStartTime.Value = DateTime.Now;
}

フォームを開いたときに初期値を設定したい場合は、Loadイベントに書くと管理しやすいです。

5-5. DBから取得した日付を初期表示する場合の考え方

データベースから取得した日付をDateTimePickerに表示したい場合も、基本はValueプロパティに代入します。

たとえば、DBから取得した値がDateTime型なら、次のように設定できます。

C#
DateTime reservationDate = GetReservationDateFromDb();

dtpReservationDate.Value = reservationDate;

ただし、DBの値がNULLになる可能性がある場合は注意が必要です。

DateTimePickerのValueプロパティには、直接nullを入れることができません。

そのため、DBから取得した値をDateTime?で扱い、値がある場合だけDateTimePickerに設定します。

C#
DateTime? reservationDate = GetReservationDateFromDb();

if (reservationDate.HasValue)
{
dtpReservationDate.Value = reservationDate.Value;
}
else
{
// 未設定の場合の表示処理を行う
}

空欄や未選択を表現したい場合は、後述するShowCheckBoxCustomFormatを使う方法があります。

6. DateTimePickerの値が変更されたときのイベント処理

6-1. ValueChangedイベントとは

DateTimePickerの値が変更されたときに処理を実行したい場合は、ValueChangedイベントを使います。

たとえば、ユーザーがカレンダーから日付を選んだときに、選択日をラベルに表示したい場合などです。

C#
private void dtpReservationDate_ValueChanged(object sender, EventArgs e)
{
lblSelectedDate.Text = dtpReservationDate.Value.ToString("yyyy/MM/dd");
}

ValueChangedイベントは、DateTimePickerのValueが変わったタイミングで発生します。

ユーザー操作だけでなく、コードからValueを変更した場合にも発生することがあります。

6-2. 日付変更時に処理を実行するサンプルコード

フォームにDateTimePickerとLabelを配置して、日付が変更されたらLabelに表示する例です。

コントロールName
DateTimePickerdtpReservationDate
LabellblSelectedDate

コードは次のようになります。

C#
private void Form1_Load(object sender, EventArgs e)
{
dtpReservationDate.Format = DateTimePickerFormat.Custom;
dtpReservationDate.CustomFormat = "yyyy/MM/dd";

lblSelectedDate.Text = dtpReservationDate.Value.ToString("yyyy/MM/dd");
}

private void dtpReservationDate_ValueChanged(object sender, EventArgs e)
{
lblSelectedDate.Text = dtpReservationDate.Value.ToString("yyyy/MM/dd");
}

このように書くと、画面表示時にもラベルに初期値が表示され、日付を変更したときにも表示が更新されます。

6-3. 選択した日付をラベルに表示する方法

DateTimePickerで選択した日付をLabelに表示する場合は、次のように書きます。

C#
private void dtpReservationDate_ValueChanged(object sender, EventArgs e)
{
lblSelectedDate.Text = $"選択日:{dtpReservationDate.Value:yyyy年MM月dd日}";
}

文字列補間を使うと、ToStringを書かずに書式を指定できます。

C#
$"{dtpReservationDate.Value:yyyy年MM月dd日}"

これは次のコードとほぼ同じ意味です。

C#
dtpReservationDate.Value.ToString("yyyy年MM月dd日")

初心者のうちは、どちらを使っても問題ありません。

読みやすい方を選びましょう。

6-4. 変更前後の値を扱いたい場合の考え方

DateTimePickerのValueChangedイベントでは、変更後の値は簡単に取得できます。

C#
DateTime newValue = dtpReservationDate.Value;

しかし、変更前の値を自動で渡してくれるわけではありません。

変更前の値も扱いたい場合は、変数に前回の値を保持しておきます。

C#
private DateTime _previousDate;

private void Form1_Load(object sender, EventArgs e)
{
_previousDate = dtpReservationDate.Value;
}

private void dtpReservationDate_ValueChanged(object sender, EventArgs e)
{
DateTime oldValue = _previousDate;
DateTime newValue = dtpReservationDate.Value;

MessageBox.Show($"変更前:{oldValue:yyyy/MM/dd}\n変更後:{newValue:yyyy/MM/dd}");

_previousDate = newValue;
}

このように、イベントの最後で前回値を更新します。

開始日と終了日の整合性チェックなどでは、変更前後の値を使う場面があります。

6-5. 初期表示時にもValueChangedが動く場合の注意点

ValueChangedイベントは、ユーザーが日付を変更したときだけでなく、コードからValueを設定したときにも発生する場合があります。

たとえば、フォームのLoadイベントで次のように書いた場合です。

C#
private void Form1_Load(object sender, EventArgs e)
{
dtpReservationDate.Value = DateTime.Today;
}

このとき、ValueChangedイベントが実行されることがあります。

初期化中は処理を実行したくない場合は、フラグを使って制御します。

C#
private bool _isInitializing = true;

private void Form1_Load(object sender, EventArgs e)
{
dtpReservationDate.Value = DateTime.Today;

_isInitializing = false;
}

private void dtpReservationDate_ValueChanged(object sender, EventArgs e)
{
if (_isInitializing)
{
return;
}

MessageBox.Show("日付が変更されました。");
}

ただし、このコードではLoadの中でValueを設定した時点では_isInitializingtrueなので、処理をスキップできます。

初期設定とユーザー操作を分けたい場合は、このようなフラグ管理が有効です。

7. DateTimePickerで入力範囲を制限する方法

7-1. MinDateで選択できる最小日付を設定する

DateTimePickerでは、選択できる日付の範囲を制限できます。

最小日付を設定するには、MinDateプロパティを使います。

C#
dtpReservationDate.MinDate = DateTime.Today;

このコードでは、今日より前の日付を選択できなくなります。

特定の日付以降だけ選択させたい場合は、次のようにします。

C#
dtpReservationDate.MinDate = new DateTime(2026, 1, 1);

この場合、2026年1月1日より前の日付は選択できません。

予約日や申請日など、過去の日付を入力させたくない場合に便利です。

7-2. MaxDateで選択できる最大日付を設定する

最大日付を設定するには、MaxDateプロパティを使います。

C#
dtpReservationDate.MaxDate = DateTime.Today.AddMonths(3);

このコードでは、今日から3か月後までしか選択できません。

特定の日付までに制限したい場合は、次のようにします。

C#
dtpReservationDate.MaxDate = new DateTime(2026, 12, 31);

この場合、2026年12月31日より後の日付は選択できません。

MinDateMaxDateを組み合わせることで、選択可能な範囲を細かく制御できます。

7-3. 今日以降の日付だけ選択させる方法

予約日や申請日などで、今日以降の日付だけを選択させたい場合は、MinDateDateTime.Todayを設定します。

C#
private void Form1_Load(object sender, EventArgs e)
{
dtpReservationDate.MinDate = DateTime.Today;
dtpReservationDate.Value = DateTime.Today;
}

このとき、Valueも範囲内の日付にしておくことが大切です。

もしValueMinDateより前の日付になっていると、エラーになることがあります。

安全に設定するなら、先にMinDateを設定し、その範囲内の値をValueに設定します。

C#
private void Form1_Load(object sender, EventArgs e)
{
DateTime today = DateTime.Today;

dtpReservationDate.MinDate = today;
dtpReservationDate.Value = today;
}

7-4. 過去の日付だけ選択させる方法

生年月日や過去の実績日など、未来の日付を選択させたくない場合は、MaxDateに今日の日付を設定します。

C#
private void Form1_Load(object sender, EventArgs e)
{
dtpBirthDate.MaxDate = DateTime.Today;
}

これで、今日より後の日付は選択できなくなります。

生年月日の場合は、最小日付も設定しておくとよいでしょう。

C#
private void Form1_Load(object sender, EventArgs e)
{
dtpBirthDate.MinDate = new DateTime(1900, 1, 1);
dtpBirthDate.MaxDate = DateTime.Today;
dtpBirthDate.Value = new DateTime(2000, 1, 1);
}

このように、業務ルールに合わせて選択範囲を決めます。

7-5. 業務アプリでよくある入力制限例

業務アプリでは、DateTimePickerの入力範囲制限をよく使います。

代表的な例を紹介します。

予約日は今日以降にする場合です。

C#
dtpReservationDate.MinDate = DateTime.Today;

生年月日は今日以前にする場合です。

C#
dtpBirthDate.MaxDate = DateTime.Today;

検索期間を過去1年に制限する場合です。

C#
dtpStartDate.MinDate = DateTime.Today.AddYears(-1);
dtpStartDate.MaxDate = DateTime.Today;

dtpEndDate.MinDate = DateTime.Today.AddYears(-1);
dtpEndDate.MaxDate = DateTime.Today;

申請日は今月内だけに制限する場合です。

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

dtpApplicationDate.MinDate = firstDay;
dtpApplicationDate.MaxDate = lastDay;

DateTimePickerのMinDateMaxDateを使うと、入力チェックを画面側である程度実現できます。

8. DateTimePickerで時刻を入力・表示する方法

8-1. FormatをTimeに設定する方法

DateTimePickerは日付だけでなく、時刻入力にも使えます。

時刻を表示したい場合は、FormatTimeを設定します。

C#
dtpStartTime.Format = DateTimePickerFormat.Time;

これで時刻形式で表示されます。

ただし、表示内容は環境によって変わることがあります。

時分だけを固定で表示したい場合は、CustomFormatを使うのがおすすめです。

C#
dtpStartTime.Format = DateTimePickerFormat.Custom;
dtpStartTime.CustomFormat = "HH:mm";

8-2. ShowUpDownでスピン入力にする方法

時刻入力では、カレンダーを表示するよりも、スピンボタンで時刻を変更する方が自然です。

その場合は、ShowUpDowntrueにします。

C#
dtpStartTime.ShowUpDown = true;

時刻入力用の設定をまとめると、次のようになります。

C#
dtpStartTime.Format = DateTimePickerFormat.Custom;
dtpStartTime.CustomFormat = "HH:mm";
dtpStartTime.ShowUpDown = true;

これで、時刻だけをスピン入力できるDateTimePickerになります。

8-3. HH:mm形式で時分だけ入力させる方法

時分だけを入力させたい場合は、CustomFormatHH:mmを指定します。

C#
private void Form1_Load(object sender, EventArgs e)
{
dtpStartTime.Format = DateTimePickerFormat.Custom;
dtpStartTime.CustomFormat = "HH:mm";
dtpStartTime.ShowUpDown = true;
dtpStartTime.Value = DateTime.Today.AddHours(9);
}

この例では、初期値を9時に設定しています。

C#
DateTime.Today.AddHours(9)

終了時刻を18時にしたい場合は次のようにします。

C#
dtpEndTime.Value = DateTime.Today.AddHours(18);

時刻だけを使いたい場合でも、DateTimePickerのValueDateTime型です。

そのため、日付部分も内部的には持っています。

時刻部分だけを取り出したい場合は、TimeOfDayを使います。

C#
TimeSpan startTime = dtpStartTime.Value.TimeOfDay;

8-4. 日付と時刻を同時に扱う場合のサンプル

日付と時刻を同時に扱いたい場合は、1つのDateTimePickerで日付と時刻を入力させる方法があります。

C#
dtpReservationDateTime.Format = DateTimePickerFormat.Custom;
dtpReservationDateTime.CustomFormat = "yyyy/MM/dd HH:mm";

取得するときは、通常どおりValueを使います。

C#
DateTime reservationDateTime = dtpReservationDateTime.Value;

また、日付用と時刻用でDateTimePickerを分ける方法もあります。

コントロール用途
dtpReservationDate日付
dtpReservationTime時刻

この場合、日付と時刻を結合して1つのDateTimeにします。

C#
DateTime date = dtpReservationDate.Value.Date;
TimeSpan time = dtpReservationTime.Value.TimeOfDay;

DateTime reservationDateTime = date + time;

この書き方は、予約日時を作るときによく使います。

C#
private void btnSave_Click(object sender, EventArgs e)
{
DateTime date = dtpReservationDate.Value.Date;
TimeSpan time = dtpReservationTime.Value.TimeOfDay;

DateTime reservationDateTime = date + time;

MessageBox.Show($"予約日時:{reservationDateTime:yyyy/MM/dd HH:mm}");
}

日付と時刻を別々の入力欄にしたい場合は、この方法が分かりやすいです。

9. DateTimePickerで空欄・未選択を表現する方法

9-1. DateTimePickerはValueにnullを直接入れられない

DateTimePickerで初心者がつまずきやすいポイントの1つが、空欄や未選択の扱いです。

DateTimePickerのValueプロパティはDateTime型です。

DateTime型は通常の値型なので、直接nullを入れることはできません。

C#
// エラーになる例
dtpReservationDate.Value = null;

そのため、DateTimePickerで「未選択」を表現したい場合は、工夫が必要です。

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

方法内容
ShowCheckBoxを使うチェックありなら選択、なしなら未選択
CustomFormatで空欄に見せる表示だけ空欄風にする
DateTime?と組み合わせるプログラム側でnullを扱う

実務では、ShowCheckBoxDateTime?を組み合わせる方法が分かりやすいです。

9-2. CheckBoxプロパティで未選択状態を表現する

DateTimePickerには、チェックボックスを表示するためのShowCheckBoxプロパティがあります。

C#
dtpReservationDate.ShowCheckBox = true;

チェックボックスがオンの場合は日付が選択されている状態、オフの場合は未選択として扱うことができます。

C#
private void btnSave_Click(object sender, EventArgs e)
{
if (dtpReservationDate.Checked)
{
DateTime selectedDate = dtpReservationDate.Value;
MessageBox.Show($"選択日:{selectedDate:yyyy/MM/dd}");
}
else
{
MessageBox.Show("日付は未選択です。");
}
}

ここで使うのは、チェック状態を表すCheckedプロパティです。

C#
dtpReservationDate.Checked

つまり、設定ではShowCheckBox、判定ではCheckedを使います。

C#
dtpReservationDate.ShowCheckBox = true;

if (dtpReservationDate.Checked)
{
// 日付あり
}
else
{
// 日付なし
}

9-3. CustomFormatで空欄のように見せる方法

DateTimePickerを空欄のように見せたい場合、CustomFormatにスペースを設定する方法があります。

C#
dtpReservationDate.Format = DateTimePickerFormat.Custom;
dtpReservationDate.CustomFormat = " ";

これで、表示上は空欄のように見えます。

日付を選択したら通常の表示形式に戻す場合は、イベントで切り替えます。

C#
private void Form1_Load(object sender, EventArgs e)
{
dtpReservationDate.Format = DateTimePickerFormat.Custom;
dtpReservationDate.CustomFormat = " ";
}

private void dtpReservationDate_ValueChanged(object sender, EventArgs e)
{
dtpReservationDate.CustomFormat = "yyyy/MM/dd";
}

ただし、この方法はあくまで「空欄のように見せる」だけです。

内部的にはDateTimePickerのValueに日付が入っています。

本当に未選択をデータとして扱いたい場合は、DateTime?ShowCheckBoxと組み合わせる方が安全です。

9-4. DateTime?型と組み合わせてnullを扱う方法

C#でNULLを扱える日付型として、DateTime?があります。

C#
DateTime? selectedDate;

DateTime?は、DateTimeの値またはnullを持てる型です。

DateTimePickerと組み合わせる場合は、チェック状態によって値を切り替えます。

C#
DateTime? selectedDate;

if (dtpReservationDate.Checked)
{
selectedDate = dtpReservationDate.Value;
}
else
{
selectedDate = null;
}

短く書くなら、次のようにも書けます。

C#
DateTime? selectedDate = dtpReservationDate.Checked
? dtpReservationDate.Value
: (DateTime?)null;

このようにすると、画面上の未選択状態をプログラム側ではnullとして扱えます。

DB保存時にもこの考え方がよく使われます。

9-5. DB保存時にNULLを扱う場合の実装例

SQL Serverなどのデータベースに日付を保存するとき、未選択ならNULLを保存したい場合があります。

その場合は、DateTime?DBNull.Valueを使います。

C#
DateTime? reservationDate = dtpReservationDate.Checked
? dtpReservationDate.Value.Date
: (DateTime?)null;

SQLパラメータに設定する例です。

C#
using System;
using System.Data;
using System.Data.SqlClient;

private void SaveReservation()
{
DateTime? reservationDate = dtpReservationDate.Checked
? dtpReservationDate.Value.Date
: (DateTime?)null;

using (SqlConnection connection = new SqlConnection("接続文字列"))
using (SqlCommand command = new SqlCommand())
{
command.Connection = connection;
command.CommandText = "INSERT INTO Reservations (ReservationDate) VALUES (@ReservationDate)";

command.Parameters.Add("@ReservationDate", SqlDbType.Date).Value =
reservationDate.HasValue ? reservationDate.Value : DBNull.Value;

connection.Open();
command.ExecuteNonQuery();
}
}

ポイントは、日付がある場合はDateTimeを渡し、ない場合はDBNull.Valueを渡すことです。

C#
reservationDate.HasValue ? reservationDate.Value : DBNull.Value

DateTimePicker自体はnullを直接扱えませんが、プログラム側でDateTime?に変換すれば、未選択を自然に扱えます。

10. DateTimePickerでよくあるエラー・つまずきポイント

10-1. Valueに文字列をそのまま代入してエラーになる

DateTimePickerのValueDateTime型です。

そのため、文字列をそのまま代入するとエラーになります。

C#
// NG
dtpReservationDate.Value = "2026/06/07";

正しくは、DateTime型の値を代入します。

C#
// OK
dtpReservationDate.Value = new DateTime(2026, 6, 7);

文字列から設定したい場合は、DateTime.ParseDateTime.TryParseを使います。

C#
DateTime date;

if (DateTime.TryParse("2026/06/07", out date))
{
dtpReservationDate.Value = date;
}
else
{
MessageBox.Show("日付の形式が正しくありません。");
}

外部ファイルやユーザー入力から日付文字列を受け取る場合は、TryParseを使うと安全です。

10-2. MinDate・MaxDateの範囲外を設定してエラーになる

DateTimePickerでは、MinDateMaxDateで選択範囲を制限できます。

ただし、Valueに設定する日付がその範囲外だとエラーになることがあります。

たとえば、次のようなコードです。

C#
dtpReservationDate.MinDate = DateTime.Today;
dtpReservationDate.Value = DateTime.Today.AddDays(-1);

MinDateが今日なのに、Valueに昨日を設定しているため範囲外です。

正しくは、範囲内の値を設定します。

C#
DateTime today = DateTime.Today;

dtpReservationDate.MinDate = today;
dtpReservationDate.Value = today;

MinDateMaxDateを使うときは、次の関係を意識しましょう。

C#
MinDate <= Value <= MaxDate

初期値を設定するときも、この範囲に収まっているか確認することが大切です。

10-3. 表示形式を変えても取得値はDateTime型のまま

DateTimePickerのFormatCustomFormatを変更すると、見た目の表示形式は変わります。

C#
dtpReservationDate.Format = DateTimePickerFormat.Custom;
dtpReservationDate.CustomFormat = "yyyy年MM月dd日";

しかし、取得できる値は常にDateTime型です。

C#
DateTime selectedDate = dtpReservationDate.Value;

表示が2026年06月07日になっていても、Valueが文字列になるわけではありません。

文字列が必要な場合は、取得後にToStringで変換します。

C#
string dateText = dtpReservationDate.Value.ToString("yyyy年MM月dd日");

この違いを理解しておくと、DateTimePickerの扱いで迷いにくくなります。

10-4. CustomFormatが思った通りに表示されない

CustomFormatが思った通りに表示されない場合、よくある原因はFormatCustomにしていないことです。

C#
// NGになりやすい例
dtpReservationDate.CustomFormat = "yyyy/MM/dd";

CustomFormatを有効にするには、先にFormatCustomにします。

C#
// OK
dtpReservationDate.Format = DateTimePickerFormat.Custom;
dtpReservationDate.CustomFormat = "yyyy/MM/dd";

また、月と分の書式を間違えるケースもよくあります。

C#
// 月は MM
"yyyy/MM/dd"

// 分は mm
"HH:mm"

たとえば、時刻のつもりでHH:MMと書くと、分ではなく月が表示されてしまいます。

C#
// NG
dtpTime.CustomFormat = "HH:MM";

// OK
dtpTime.CustomFormat = "HH:mm";

月は大文字のM、分は小文字のmと覚えておきましょう。

10-5. WPFのDatePickerとWinFormsのDateTimePickerを混同している

C#には、Windows FormsだけでなくWPFというUIフレームワークもあります。

Windows Formsでは、日付入力にDateTimePickerを使います。

一方、WPFでは主にDatePickerを使います。

名前が似ているため、検索していると情報が混ざることがあります。

種類主なコントロール
Windows FormsDateTimePicker
WPFDatePicker

この記事で解説しているのは、Windows FormsのDateTimePickerです。

WPFのDatePickerとはプロパティやイベントが異なるため、コードをそのまま使えない場合があります。

たとえば、WPFのDatePickerではSelectedDateを使いますが、WinFormsのDateTimePickerではValueを使います。

C#
// WinForms
DateTime selectedDate = dateTimePicker1.Value;

自分が作っているアプリがWindows FormsなのかWPFなのかを確認してから、サンプルコードを参考にしましょう。

11. DateTimePickerの実用サンプルコード

11-1. 選択した日付をMessageBoxで表示する

まずは基本的なサンプルです。

DateTimePickerで選択した日付を、ボタンクリック時にMessageBoxで表示します。

フォームに次のコントロールを配置します。

コントロールName
DateTimePickerdtpReservationDate
ButtonbtnShowDate

コードは次のとおりです。

C#
private void Form1_Load(object sender, EventArgs e)
{
dtpReservationDate.Format = DateTimePickerFormat.Custom;
dtpReservationDate.CustomFormat = "yyyy/MM/dd";
dtpReservationDate.Value = DateTime.Today;
}

private void btnShowDate_Click(object sender, EventArgs e)
{
DateTime selectedDate = dtpReservationDate.Value;

MessageBox.Show($"選択された日付は {selectedDate:yyyy/MM/dd} です。");
}

DateTimePickerの最も基本的な使い方です。

まずはこの形を覚えておくと、他の処理にも応用しやすくなります。

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

DateTimePickerで選択した生年月日から年齢を計算するサンプルです。

フォームに次のコントロールを配置します。

コントロールName
DateTimePickerdtpBirthDate
ButtonbtnCalculateAge
LabellblAge

コードは次のとおりです。

C#
private void Form1_Load(object sender, EventArgs e)
{
dtpBirthDate.Format = DateTimePickerFormat.Custom;
dtpBirthDate.CustomFormat = "yyyy/MM/dd";

dtpBirthDate.MinDate = new DateTime(1900, 1, 1);
dtpBirthDate.MaxDate = DateTime.Today;
dtpBirthDate.Value = new DateTime(2000, 1, 1);
}

private void btnCalculateAge_Click(object sender, EventArgs e)
{
DateTime birthDate = dtpBirthDate.Value.Date;
DateTime today = DateTime.Today;

int age = today.Year - birthDate.Year;

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

lblAge.Text = $"年齢:{age}歳";
}

年齢計算では、単純に年だけを引くと誕生日前後でずれることがあります。

そのため、今年の誕生日がまだ来ていない場合は、年齢から1を引いています。

C#
if (today < birthDate.AddYears(age))
{
age--;
}

生年月日の入力では、未来の日付を選べないようにMaxDateも設定しておくと安全です。

11-3. 予約日を今日以降に制限する

予約日を入力する画面では、過去の日付を選ばせたくないことがよくあります。

その場合は、MinDateを使います。

C#
private void Form1_Load(object sender, EventArgs e)
{
dtpReservationDate.Format = DateTimePickerFormat.Custom;
dtpReservationDate.CustomFormat = "yyyy/MM/dd";

dtpReservationDate.MinDate = DateTime.Today;
dtpReservationDate.Value = DateTime.Today;
}

保存ボタンをクリックしたときの処理例です。

C#
private void btnSave_Click(object sender, EventArgs e)
{
DateTime reservationDate = dtpReservationDate.Value.Date;

MessageBox.Show($"予約日 {reservationDate:yyyy/MM/dd} を保存します。");
}

画面側で過去日を選択できないようにしておけば、保存時の入力チェックもシンプルになります。

ただし、重要な業務処理では、画面側だけでなく保存処理側でもチェックするとより安全です。

C#
private void btnSave_Click(object sender, EventArgs e)
{
DateTime reservationDate = dtpReservationDate.Value.Date;

if (reservationDate < DateTime.Today)
{
MessageBox.Show("予約日は今日以降を選択してください。");
return;
}

MessageBox.Show($"予約日 {reservationDate:yyyy/MM/dd} を保存します。");
}

11-4. 開始日と終了日の整合性をチェックする

検索画面や期間指定では、開始日と終了日のDateTimePickerを使うことがよくあります。

このとき、開始日が終了日より後にならないようにチェックします。

フォームに次のコントロールを配置します。

コントロールName
DateTimePickerdtpStartDate
DateTimePickerdtpEndDate
ButtonbtnSearch

コードは次のとおりです。

C#
private void Form1_Load(object sender, EventArgs e)
{
dtpStartDate.Format = DateTimePickerFormat.Custom;
dtpStartDate.CustomFormat = "yyyy/MM/dd";

dtpEndDate.Format = DateTimePickerFormat.Custom;
dtpEndDate.CustomFormat = "yyyy/MM/dd";

dtpStartDate.Value = DateTime.Today.AddDays(-7);
dtpEndDate.Value = DateTime.Today;
}

private void btnSearch_Click(object sender, EventArgs e)
{
DateTime startDate = dtpStartDate.Value.Date;
DateTime endDate = dtpEndDate.Value.Date;

if (startDate > endDate)
{
MessageBox.Show("開始日は終了日以前の日付を選択してください。");
return;
}

MessageBox.Show($"検索期間:{startDate:yyyy/MM/dd} ~ {endDate:yyyy/MM/dd}");
}

さらに、開始日が変更されたら終了日の最小値を変更することもできます。

C#
private void dtpStartDate_ValueChanged(object sender, EventArgs e)
{
dtpEndDate.MinDate = dtpStartDate.Value.Date;

if (dtpEndDate.Value.Date < dtpStartDate.Value.Date)
{
dtpEndDate.Value = dtpStartDate.Value.Date;
}
}

このようにすると、開始日より前の終了日を選びにくくなります。

ただし、MinDateValueの設定順によってエラーになることがあるため、範囲外の値を設定しないように注意しましょう。

11-5. SQL Serverやデータベース保存を想定した値の扱い方

DateTimePickerで選択した日付をデータベースに保存する場合、基本的にはDateTime型のままパラメータに渡します。

文字列に変換してSQL文へ連結する方法は避けましょう。

よくない例です。

C#
// NG例
string sql = "INSERT INTO Reservations (ReservationDate) VALUES ('"
+ dtpReservationDate.Value.ToString("yyyy/MM/dd") + "')";

このように文字列連結でSQLを作ると、形式の問題やSQLインジェクションのリスクがあります。

安全な方法は、パラメータを使うことです。

C#
using System;
using System.Data;
using System.Data.SqlClient;

private void SaveReservation()
{
DateTime reservationDate = dtpReservationDate.Value.Date;

using (SqlConnection connection = new SqlConnection("接続文字列"))
using (SqlCommand command = new SqlCommand())
{
command.Connection = connection;
command.CommandText = @"
INSERT INTO Reservations
(ReservationDate)
VALUES
(@ReservationDate)";

command.Parameters.Add("@ReservationDate", SqlDbType.Date).Value = reservationDate;

connection.Open();
command.ExecuteNonQuery();
}

MessageBox.Show("保存しました。");
}

日付と時刻を両方保存する場合は、SqlDbType.DateTimeSqlDbType.DateTime2を使います。

C#
DateTime reservationDateTime = dtpReservationDateTime.Value;

command.Parameters.Add("@ReservationDateTime", SqlDbType.DateTime2).Value = reservationDateTime;

未選択を許可する場合は、ShowCheckBoxDateTime?を使います。

C#
DateTime? reservationDate = dtpReservationDate.Checked
? dtpReservationDate.Value.Date
: (DateTime?)null;

command.Parameters.Add("@ReservationDate", SqlDbType.Date).Value =
reservationDate.HasValue ? reservationDate.Value : DBNull.Value;

DateTimePickerの表示形式は画面上の見た目に関する設定です。

DB保存では、表示文字列ではなくDateTime型の値を正しく渡すことが重要です。

まとめ

C#のDateTimePickerは、Windows Formsで日付や時刻を入力するための便利なコントロールです。

TextBoxで日付を入力させる場合と比べて、入力ミスを減らしやすく、DateTime型として値を扱えるため、日付計算や比較、データベース保存にも向いています。

基本的な日付取得は、Valueプロパティを使います。

C#
DateTime selectedDate = dtpReservationDate.Value;

表示形式を変更したい場合は、FormatCustomFormatを使います。

C#
dtpReservationDate.Format = DateTimePickerFormat.Custom;
dtpReservationDate.CustomFormat = "yyyy/MM/dd";

初期値を設定する場合も、ValueDateTime型の値を代入します。

C#
dtpReservationDate.Value = DateTime.Today;

値が変更されたときに処理を実行したい場合は、ValueChangedイベントを使います。

C#
private void dtpReservationDate_ValueChanged(object sender, EventArgs e)
{
lblSelectedDate.Text = dtpReservationDate.Value.ToString("yyyy/MM/dd");
}

入力範囲を制限したい場合は、MinDateMaxDateを使います。

C#
dtpReservationDate.MinDate = DateTime.Today;
dtpReservationDate.MaxDate = DateTime.Today.AddMonths(3);

時刻を入力したい場合は、CustomFormatShowUpDownを組み合わせると便利です。

C#
dtpStartTime.Format = DateTimePickerFormat.Custom;
dtpStartTime.CustomFormat = "HH:mm";
dtpStartTime.ShowUpDown = true;

また、DateTimePickerはValuenullを直接設定できません。

未選択を扱いたい場合は、ShowCheckBoxCheckedDateTime?を組み合わせて実装します。

C#
DateTime? selectedDate = dtpReservationDate.Checked
? dtpReservationDate.Value
: (DateTime?)null;

C# DateTimePickerは、予約日、生年月日、検索期間、開始日時、終了日時など、業務アプリで非常によく使うコントロールです。

まずは、Valueで取得する、CustomFormatで表示形式を変える、MinDateMaxDateで範囲制限する、という基本を押さえておきましょう。