C# DateTimeの使い方完全ガイド|日付・時刻の取得、変換、比較、フォーマットを初心者向けに解説
はじめに
C#で日付や時刻を扱うときに最もよく使う型がDateTimeです。
現在日時の取得、日付の作成、文字列への変換、文字列からの日付変換、日付比較、加算・減算、経過時間の計算など、アプリケーション開発では非常に多くの場面で登場します。
たとえば、次のような処理でDateTimeを使います。
C#DateTime now = DateTime.Now;
Console.WriteLine(now);
DateTimeは便利な一方で、初心者がつまずきやすいポイントもあります。
特に、次のような点には注意が必要です。
DateTime.NowとDateTime.UtcNowの違いyyyyとYYYYのようなフォーマット指定の違いMMとmmの違い文字列を日付に変換するときのエラー
タイムゾーンやサマータイムの扱い
DateTimeとDateTimeOffset、DateOnly、TimeOnlyの使い分け
この記事では、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は、日付と時刻そのものを表す型です。
一方で、string、int、TimeSpanとは役割が異なります。
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.NowとDateTime.UtcNowの違いです。
DateTime.Nowはローカル時刻、DateTime.UtcNowはUTC時刻を返します。
C#Console.WriteLine(DateTime.Now);
Console.WriteLine(DateTime.UtcNow);
国内だけで使う簡単なアプリならDateTime.Nowで十分なこともありますが、海外ユーザーやサーバー間連携がある場合はUTCやDateTimeOffsetを検討する必要があります。
2. DateTimeで現在の日付・時刻を取得する方法
C#で現在の日付や時刻を取得するには、DateTime.Now、DateTime.Today、DateTime.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.Now、DateTime.Today、DateTime.UtcNowの違いは次のとおりです。
| プロパティ | 取得できる値 | 主な用途 |
|---|---|---|
| DateTime.Now | ローカルの現在日時 | 画面表示、ローカルアプリ |
| DateTime.Today | 今日の日付の0時 | 日付だけの比較 |
| DateTime.UtcNow | UTCの現在日時 | 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.MinValueとDateTime.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.Utc | UTC時刻 |
| 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は、ToLocalTimeやToUniversalTimeの変換時に影響します。
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の使い方
年、月、日を取得するには、Year、Month、Dayを使います。
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の使い方
時、分、秒、ミリ秒を取得するには、Hour、Minute、Second、Millisecondを使います。
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
ゼロ埋めしたい場合はMMやddを使います。
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 | ソート可能な形式 |
| u | UTCのソート可能形式 |
実行環境やCultureInfoによって表示結果が変わる指定子もあります。
形式を完全に固定したい場合は、カスタム日時書式指定子を使います。
5-6. カスタム日時書式指定子の一覧
よく使うカスタム日時書式指定子は次のとおりです。
| 指定子 | 意味 | 例 |
|---|---|---|
| yyyy | 4桁の年 | 2026 |
| yy | 2桁の年 | 26 |
| MM | 2桁の月 | 01 |
| M | 1桁または2桁の月 | 1 |
| dd | 2桁の日 | 05 |
| d | 1桁または2桁の日 | 5 |
| HH | 24時間表記の時 | 09 |
| H | 24時間表記の時 | 9 |
| hh | 12時間表記の時 | 09 |
| mm | 分 | 30 |
| ss | 秒 | 45 |
| fff | ミリ秒 | 123 |
| ddd | 短い曜日名 | 木 |
| dddd | 長い曜日名 | 木曜日 |
特に注意したいのは、MMとmmの違いです。
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に変換するには、Parse、TryParse、ParseExact、TryParseExactを使います。
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より前 |
| 0 | aと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より前の日付です");
}
ただし、yyyyMMddやyyyy-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);
DaysやHoursは、日・時・分の各部分を表します。
一方、TotalDaysやTotalHoursは、全体を日数や時間に換算した値です。
C#Console.WriteLine(diff.Days); // 日数部分
Console.WriteLine(diff.TotalDays); // 全体を日数に換算
経過時間を正確に計算したい場合は、TotalHoursやTotalMinutesを使うことが多いです。
9. DateTimeの実務でよく使う処理パターン
ここでは、実務でよく使うDateTimeの処理パターンを紹介します。
9-1. 今日かどうかを判定する
対象日時が今日かどうかを判定するには、.DateとDateTime.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 | ローカル時刻 |
| Utc | UTC時刻 |
| Unspecified | ローカルかUTCか未指定 |
DateTime.NowはLocalです。
C#Console.WriteLine(DateTime.Now.Kind); // Local
DateTime.UtcNowはUtcです。
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());
KindがUnspecifiedの場合、実行環境によって期待と異なる変換になることがあります。
日時の意味が明確な場合は、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);
サマータイムを考慮するシステムでは、TimeZoneInfoやDateTimeOffsetを使って、タイムゾーン情報を明確に扱うことが重要です。
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の使い分け
DateTime、DateOnly、TimeOnlyは、扱いたい情報によって使い分けます。
| 型 | 扱う情報 | 主な用途 |
|---|---|---|
| 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を使う前に必ずHasValueやnullチェックを行いましょう。
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.ParseやToStringは、地域設定の影響を受けることがあります。
たとえば、01/02/2026という文字列は、地域によって1月2日とも2月1日とも解釈される可能性があります。
C#string text = "01/02/2026";
DateTime date = DateTime.Parse(text);
このような曖昧な形式は避けるべきです。
入力形式が決まっている場合は、ParseExactやTryParseExactを使います。
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("日付に変換できませんでした");
}
実務では、例外を避けて安全に処理できるTryParseやTryParseExactを使う場面が多いです。
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.Now、DateTime.Today、DateTime.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");
文字列から変換するには、Parse、TryParse、ParseExact、TryParseExactを使います。
C#if (DateTime.TryParse("2026/01/15", out DateTime date))
{
Console.WriteLine(date);
}
日付の比較は、比較演算子やCompare、CompareToを使います。
C#if (DateTime.Now > deadline)
{
Console.WriteLine("期限切れです");
}
日付の加算・減算には、AddDays、AddMonths、AddYears、AddHoursなどを使います。
C#DateTime tomorrow = DateTime.Today.AddDays(1);
日付同士の差分はTimeSpanで取得できます。
C#TimeSpan diff = end - start;
また、日付だけを扱うならDateOnly、時刻だけを扱うならTimeOnly、タイムゾーンやオフセットを明確に扱いたいならDateTimeOffsetも検討しましょう。
DateTimeは使用頻度が高い分、フォーマット、タイムゾーン、文字列変換、比較方法でミスが起こりやすい型です。
基本的な使い方を押さえたうえで、実務では「日付だけなのか」「時刻も必要なのか」「UTCで保存すべきか」「タイムゾーンを考慮すべきか」を意識して使い分けることが大切です。

