C#で現在時刻を取得・表示する方法|DateTime.Nowの使い方からフォーマット指定まで解説

はじめに

C#で現在時刻を取得する基本は、DateTime.Nowを使うことです。たとえば「今の日時を画面に表示したい」「ログに実行時刻を残したい」「登録日時や更新日時を保存したい」といった場面では、まずDateTimeを理解しておくとスムーズに実装できます。

一方で、C#の時刻処理では「ローカル時刻なのかUTCなのか」「表示形式をどう指定するのか」「タイムゾーンをどう扱うのか」に注意が必要です。単に現在時刻を取得するだけなら簡単ですが、Webアプリやサーバー処理、海外ユーザー向けシステムでは、時刻のずれが不具合につながることもあります。

この記事では、C#で現在時刻を取得・表示する方法を、DateTime.Nowの基本からフォーマット指定、UTC、タイムゾーン、日時計算、実務での活用例まで順番に解説します。

1. C#で現在時刻を取得する基本

1-1. C#で現在時刻を扱うときに使う主なクラス

C#で日時や時刻を扱うときによく使う型には、主に次のようなものがあります。

主な用途
DateTime日付と時刻をまとめて扱う
DateTimeOffset日付・時刻にUTCからのオフセットを含めて扱う
TimeSpan時間の長さや差分を扱う
TimeZoneInfoタイムゾーン変換を扱う
DateOnly日付だけを扱う
TimeOnly時刻だけを扱う
Stopwatch処理時間や経過時間を計測する

もっとも基本的なのはDateTimeです。現在日時の取得、日時の比較、日付の加算、文字列への変換など、多くの処理に対応できます。

DateTimeOffsetは、UTCからの差分を含めて時刻を表現できるため、WebアプリやAPI、データベース保存など、タイムゾーンを意識する場面で便利です。Microsoftのドキュメントでも、DateTimeOffset.Nowは現在のローカル日時とUTCからのオフセットを持つ値を返すと説明されています。

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

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

C#
DateTime now = DateTime.Now;

Console.WriteLine(now);

DateTime.Nowは、プログラムを実行しているコンピューターのローカル時刻を取得します。Microsoftの公式ドキュメントでも、DateTime.Nowは現在のコンピューターにおけるローカル日時を表すDateTimeを返すプロパティとして説明されています。

日本時間に設定されたPCやサーバーで実行すれば、日本時間の現在日時が取得されます。一方、サーバーのタイムゾーンがUTCに設定されている場合は、DateTime.Nowで取得される値もUTC基準に見えることがあります。

1-3. DateTime.Todayで今日の日付だけを取得する方法

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

C#
DateTime today = DateTime.Today;

Console.WriteLine(today);

DateTime.Todayは今日の日付を返しますが、時刻部分は00:00:00になります。公式ドキュメントでも、DateTime.Todayは現在の日付を取得し、時刻コンポーネントは00:00:00に設定されると説明されています。

たとえば、今日が2026年6月7日であれば、内部的には次のような値になります。

2026/06/07 00:00:00

「今日の日付で検索したい」「日付単位で比較したい」といった処理では、DateTime.Todayが便利です。

1-4. TimeOnly・DateOnlyとの違い

DateTimeは日付と時刻の両方を持ちます。これに対して、DateOnlyは日付だけ、TimeOnlyは時刻だけを扱う型です。

C#
DateOnly date = DateOnly.FromDateTime(DateTime.Now);
TimeOnly time = TimeOnly.FromDateTime(DateTime.Now);

Console.WriteLine(date);
Console.WriteLine(time);

DateOnlyは「2026/06/07」のような日付だけを表現する場合に向いています。公式ドキュメントでも、DateOnlyはグレゴリオ暦における日付値を表す型として説明されています。

一方、TimeOnlyは「14:30:00」のような時刻だけを表現する場合に使います。公式ドキュメントでは、TimeOnlyは時計から読み取れる1日の時刻を表す型で、範囲は00:00:00から23:59:59.9999999までとされています。

ただし、単純に現在日時を取得して表示したいだけであれば、まずはDateTime.Nowを使えば十分です。

2. DateTime.Nowの基本的な使い方

2-1. 現在時刻をコンソールに表示するサンプルコード

もっともシンプルなサンプルは次のとおりです。

C#
using System;

class Program
{
static void Main()
{
Console.WriteLine(DateTime.Now);
}
}

実行結果の例は次のようになります。

2026/06/07 14:35:20

ただし、実際の表示形式は実行環境のカルチャ設定によって変わることがあります。日本語環境ではyyyy/MM/dd HH:mm:ssに近い形式で表示されることが多いですが、英語環境では6/7/2026 2:35:20 PMのように表示される場合があります。

表示形式を固定したい場合は、後述するToStringメソッドでフォーマットを指定します。

2-2. 変数に現在時刻を代入する方法

現在時刻は、DateTime型の変数に代入して使えます。

C#
DateTime currentTime = DateTime.Now;

Console.WriteLine(currentTime);

変数に代入しておくと、その時点の日時を固定して扱えます。

C#
DateTime startedAt = DateTime.Now;

// 何らかの処理
Console.WriteLine($"処理開始時刻: {startedAt}");

DateTime.Nowは呼び出すたびにその瞬間の時刻を取得するため、同じ値を複数箇所で使いたい場合は、変数に入れて使い回すのが安全です。

2-3. 年・月・日・時・分・秒を個別に取得する方法

DateTimeには、年・月・日・時・分・秒を取得するプロパティが用意されています。

C#
DateTime now = DateTime.Now;

int year = now.Year;
int month = now.Month;
int day = now.Day;
int hour = now.Hour;
int minute = now.Minute;
int second = now.Second;

Console.WriteLine($"年: {year}");
Console.WriteLine($"月: {month}");
Console.WriteLine($"日: {day}");
Console.WriteLine($"時: {hour}");
Console.WriteLine($"分: {minute}");
Console.WriteLine($"秒: {second}");

出力例は次のとおりです。

年: 2026
月: 6
日: 7
時: 14
分: 35
秒: 20

年月日や時分秒を個別に使いたい場合は、文字列を分割するのではなく、これらのプロパティを使いましょう。

2-4. ミリ秒まで取得する方法

ミリ秒を取得したい場合は、Millisecondプロパティを使います。

C#
DateTime now = DateTime.Now;

Console.WriteLine(now.Millisecond);

日時全体をミリ秒付きで表示したい場合は、フォーマット指定子fffを使います。

C#
DateTime now = DateTime.Now;

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

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

2026/06/07 14:35:20.123

ログやデバッグ用途では、秒だけでなくミリ秒まで出力すると、処理順序を確認しやすくなります。

3. 現在時刻を指定した形式で表示する方法

3-1. ToStringメソッドで日時を文字列に変換する

DateTimeを指定した形式で表示するには、ToStringメソッドを使います。

C#
DateTime now = DateTime.Now;

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

Console.WriteLine(text);

DateTimeDateTimeOffsetでは、カスタム日時書式をToStringなどで使い、日時値を文字列表現に変換できます。Microsoftのドキュメントでも、カスタム日時書式文字列はDateTimeおよびDateTimeOffsetの文字列変換で利用できると説明されています。

3-2. yyyy/MM/dd HH:mm:ss形式で表示する

実務でよく使われる形式は、次のような年月日と時分秒を含む形式です。

C#
DateTime now = DateTime.Now;

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

出力例です。

2026/06/07 14:35:20

それぞれの指定子の意味は次のとおりです。

指定子意味
yyyy4桁の年
MM2桁の月
dd2桁の日
HH24時間表記の時
mm
ss

C#では、月は大文字のMM、分は小文字のmmです。ここは間違えやすいので注意しましょう。

3-3. 日付だけ・時刻だけを表示する

日付だけを表示したい場合は、次のように指定します。

C#
DateTime now = DateTime.Now;

Console.WriteLine(now.ToString("yyyy/MM/dd"));

出力例です。

2026/06/07

時刻だけを表示したい場合は、次のようにします。

C#
DateTime now = DateTime.Now;

Console.WriteLine(now.ToString("HH:mm:ss"));

出力例です。

14:35:20

画面表示では日付だけ、ログでは日時全体、ファイル名では秒まで、というように用途に応じてフォーマットを使い分けるとよいでしょう。

3-4. 曜日を含めて表示する

曜日を表示したい場合は、dddまたはddddを使います。

C#
DateTime now = DateTime.Now;

Console.WriteLine(now.ToString("yyyy/MM/dd ddd"));
Console.WriteLine(now.ToString("yyyy/MM/dd dddd"));

日本語環境での出力例は次のようになります。

2026/06/07 日
2026/06/07 日曜日

曜日まで表示したい場合は、ユーザー向けの画面や帳票などで便利です。

3-5. 日本語表記で日時を表示する

日本語表記を明示したい場合は、CultureInfoを指定します。

C#
using System;
using System.Globalization;

class Program
{
static void Main()
{
DateTime now = DateTime.Now;
CultureInfo culture = new CultureInfo("ja-JP");

Console.WriteLine(now.ToString("yyyy年MM月dd日 HH時mm分ss秒", culture));
Console.WriteLine(now.ToString("yyyy年MM月dd日 dddd", culture));
}
}

出力例です。

2026年06月07日 14時35分20秒
2026年06月07日 日曜日

サーバー環境や実行ユーザーの設定によって既定カルチャが異なる場合があります。日本語で固定したい場合は、new CultureInfo("ja-JP")を指定すると意図した表示にしやすくなります。

4. C#でよく使う日時フォーマット指定子

4-1. 年・月・日を表すフォーマット

日付部分でよく使う指定子は次のとおりです。

指定子内容出力例
yyyy4桁の年2026
yy2桁の年26
MM2桁の月06
M1桁または2桁の月6
dd2桁の日07
d1桁または2桁の日7
ddd短い曜日名
dddd長い曜日名日曜日

たとえば、yyyyMMddを指定すると、ファイル名に使いやすい日付文字列を作れます。

C#
DateTime now = DateTime.Now;

Console.WriteLine(now.ToString("yyyyMMdd"));

出力例です。

20260607

4-2. 時・分・秒を表すフォーマット

時刻部分でよく使う指定子は次のとおりです。

指定子内容出力例
HH24時間表記の時14
H24時間表記の時、ゼロ埋めなし14
hh12時間表記の時02
h12時間表記の時、ゼロ埋めなし2
mm35
m分、ゼロ埋めなし35
ss20
s秒、ゼロ埋めなし20
fffミリ秒123
ttAM/PM午後またはPM

時刻を24時間表記で表示したい場合は、HH:mm:ssを使います。

C#
Console.WriteLine(DateTime.Now.ToString("HH:mm:ss"));

4-3. 12時間表記と24時間表記の違い

HHは24時間表記、hhは12時間表記です。

C#
DateTime now = new DateTime(2026, 6, 7, 14, 35, 20);

Console.WriteLine(now.ToString("HH:mm:ss"));
Console.WriteLine(now.ToString("hh:mm:ss tt"));

出力例です。

14:35:20
02:35:20 午後

業務システムやログでは、午前・午後の解釈ミスを避けるため、24時間表記のHH:mm:ssを使うことが多いです。

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

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

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

Console.WriteLine(date.ToString("yyyy/MM/dd HH:mm:ss"));
Console.WriteLine(date.ToString("yyyy/M/d H:m:s"));

出力例です。

2026/06/07 04:05:06
2026/6/7 4:5:6

ログ、ファイル名、CSV出力、データ連携などでは、桁数が揃うゼロ埋めありの形式が扱いやすいです。

4-5. よく使うフォーマット早見表

C#で現在時刻を表示するときによく使うフォーマットをまとめると、次のようになります。

用途フォーマット出力例
日時の基本表示yyyy/MM/dd HH:mm:ss2026/06/07 14:35:20
日付だけyyyy/MM/dd2026/06/07
時刻だけHH:mm:ss14:35:20
ミリ秒付きyyyy/MM/dd HH:mm:ss.fff2026/06/07 14:35:20.123
ファイル名向けyyyyMMdd_HHmmss20260607_143520
日本語表記yyyy年MM月dd日 HH時mm分ss秒2026年06月07日 14時35分20秒
ISO 8601風yyyy-MM-ddTHH:mm:ss2026-06-07T14:35:20

特にファイル名に使う場合は、/:を含めないようにしましょう。Windowsではファイル名に使えない文字があるため、yyyyMMdd_HHmmssのような形式が安全です。

5. DateTime.NowとDateTime.UtcNowの違い

5-1. DateTime.Nowはローカル時刻を取得する

DateTime.Nowは、実行環境のローカル時刻を取得します。

C#
DateTime localNow = DateTime.Now;

Console.WriteLine(localNow);
Console.WriteLine(localNow.Kind);

Kindプロパティは、そのDateTimeがローカル時刻なのか、UTCなのか、未指定なのかを表します。DateTime.Nowで取得した値のKindは通常Localになります。

ローカル時刻は、PCやサーバーのタイムゾーン設定に依存します。そのため、開発環境では日本時間だったのに、本番環境ではUTCになっているというケースもあります。

5-2. DateTime.UtcNowはUTC時刻を取得する

UTC時刻を取得したい場合は、DateTime.UtcNowを使います。

C#
DateTime utcNow = DateTime.UtcNow;

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

DateTime.UtcNowは、協定世界時、つまりUTCでの現在日時を取得します。公式ドキュメントでも、DateTime.UtcNowは現在のコンピューターにおける日時をUTCとして表すDateTimeを返すと説明されています。

サーバー処理、API、データベース保存では、UTCを基準にしておくとタイムゾーンの違いによる混乱を減らせます。

5-3. 日本時間とUTCの違い

日本時間はUTCより9時間進んでいます。つまり、日本時間が2026/06/07 18:00:00の場合、UTCでは2026/06/07 09:00:00です。

C#
DateTime utcNow = DateTime.UtcNow;
DateTime japanTime = utcNow.AddHours(9);

Console.WriteLine($"UTC: {utcNow}");
Console.WriteLine($"日本時間: {japanTime}");

ただし、実務では単純にAddHours(9)するより、TimeZoneInfoを使った変換の方が安全です。日本には現在サマータイムがありませんが、他国のタイムゾーンでは夏時間があるため、固定の時差で計算すると誤差が出る場合があります。

5-4. Webアプリやサーバー処理でUTCを使うべきケース

次のようなケースでは、UTCで保存し、表示時にユーザーのタイムゾーンへ変換する設計がよく使われます。

ケースUTCを使う理由
海外ユーザーが使うサービスユーザーごとにタイムゾーンが違うため
APIで日時をやり取りする受け手の環境に依存しにくくするため
DBに登録日時・更新日時を保存するサーバー移転やタイムゾーン変更に強くするため
ログを集約する複数サーバーの時刻を比較しやすくするため
クラウド環境で動かすサーバーのタイムゾーンがUTCの場合があるため

画面表示は日本時間、内部保存はUTC、というように役割を分けると、日時の扱いが整理しやすくなります。

6. タイムゾーンを考慮して現在時刻を取得する方法

6-1. TimeZoneInfoを使って時刻を変換する

タイムゾーンを考慮して時刻を変換するには、TimeZoneInfoを使います。

C#
DateTime utcNow = DateTime.UtcNow;

TimeZoneInfo japanZone = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
DateTime japanTime = TimeZoneInfo.ConvertTimeFromUtc(utcNow, japanZone);

Console.WriteLine(japanTime);

TimeZoneInfoは任意のタイムゾーンを表現でき、あるタイムゾーンの時刻を別のタイムゾーンに変換するために使えます。Microsoftのドキュメントでも、TimeZoneInfoはローカルタイムゾーンだけでなく任意のタイムゾーンを表せる型として説明されています。

なお、タイムゾーンIDは実行環境によって異なる場合があります。WindowsではTokyo Standard Time、LinuxやmacOSではAsia/Tokyoを使うケースがあります。クロスプラットフォーム対応が必要な場合は、実行環境で利用できるタイムゾーンIDを確認しておきましょう。

6-2. UTCから日本時間へ変換するサンプルコード

UTCから日本時間へ変換する例です。

C#
using System;

class Program
{
static void Main()
{
DateTime utcNow = DateTime.UtcNow;

TimeZoneInfo tokyoTimeZone =
TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");

DateTime tokyoTime =
TimeZoneInfo.ConvertTimeFromUtc(utcNow, tokyoTimeZone);

Console.WriteLine($"UTC: {utcNow:yyyy/MM/dd HH:mm:ss}");
Console.WriteLine($"日本時間: {tokyoTime:yyyy/MM/dd HH:mm:ss}");
}
}

TimeZoneInfo.ConvertTimeFromUtcは、UTCのDateTimeを指定したタイムゾーンの日時に変換するメソッドです。公式ドキュメントでも、このメソッドはUTCを指定したタイムゾーンの時刻に変換すると説明されています。

LinuxやmacOSでTokyo Standard Timeが見つからない場合は、次のようにAsia/Tokyoを試します。

C#
TimeZoneInfo tokyoTimeZone =
TimeZoneInfo.FindSystemTimeZoneById("Asia/Tokyo");

環境差を吸収したい場合は、両方を試す処理にしておくと実用的です。

C#
static TimeZoneInfo GetTokyoTimeZone()
{
try
{
return TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
}
catch (TimeZoneNotFoundException)
{
return TimeZoneInfo.FindSystemTimeZoneById("Asia/Tokyo");
}
}

6-3. 海外ユーザー向けシステムで注意すべきポイント

海外ユーザー向けのシステムでは、「現在時刻」が誰にとっての現在時刻なのかを明確にする必要があります。

たとえば、日本のサーバーでDateTime.Nowを取得すると日本時間になります。しかし、アメリカのユーザーにとっては、その時刻をそのまま表示されても分かりにくい場合があります。

設計としては、次のような方針がよく使われます。

処理推奨方針
DB保存UTCで保存
API送受信UTCまたはオフセット付き日時で扱う
画面表示ユーザーのタイムゾーンに変換
ログUTCで統一、またはタイムゾーンを明記
入力日時ユーザーのタイムゾーン情報とセットで扱う

特に予約、締切、決済、配信開始日時などは、タイムゾーンのずれが大きな問題になりやすいので注意が必要です。

6-4. サーバー環境によって時刻がずれる原因

C#で現在時刻が想定とずれる主な原因は、サーバーや実行環境のタイムゾーン設定です。

よくある原因は次のとおりです。

原因内容
サーバーのタイムゾーンがUTCDateTime.Nowが日本時間ではなくUTC基準になる
Dockerコンテナのタイムゾーン設定コンテナ内の時刻設定がホストと異なる
クラウド環境の既定設定環境によってUTCが標準になっている
OSのタイムゾーンID差WindowsとLinuxでタイムゾーンIDが異なる
DB保存時の変換アプリ側とDB側で時刻変換が二重に行われる

「9時間ずれる」という現象は、日本時間とUTCの差が原因であることが多いです。この場合、DateTime.NowDateTime.UtcNowのどちらを使っているか、DBにはどのタイムゾーンで保存しているかを確認しましょう。

7. 現在時刻を比較・計算する方法

7-1. 現在時刻と指定日時を比較する

現在時刻と指定日時を比較するには、比較演算子を使えます。

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

if (now > deadline)
{
Console.WriteLine("期限を過ぎています。");
}
else
{
Console.WriteLine("期限内です。");
}

DateTimeは、><>=<=などで比較できます。

C#
DateTime now = DateTime.Now;
DateTime target = new DateTime(2026, 6, 7, 12, 0, 0);

Console.WriteLine(now == target);
Console.WriteLine(now > target);
Console.WriteLine(now < target);

ただし、UTCとローカル時刻を混ぜて比較しないように注意しましょう。比較前に同じ基準へ揃えることが大切です。

7-2. 現在時刻に日数・時間・分を加算する

DateTimeには、日数や時間を加算するメソッドがあります。

C#
DateTime now = DateTime.Now;

DateTime tomorrow = now.AddDays(1);
DateTime afterThreeHours = now.AddHours(3);
DateTime afterThirtyMinutes = now.AddMinutes(30);

Console.WriteLine(tomorrow);
Console.WriteLine(afterThreeHours);
Console.WriteLine(afterThirtyMinutes);

よく使うメソッドは次のとおりです。

メソッド内容
AddYears年を加算
AddMonths月を加算
AddDays日を加算
AddHours時間を加算
AddMinutes分を加算
AddSeconds秒を加算
AddMillisecondsミリ秒を加算

有効期限、予約期限、リトライ間隔、キャッシュ期限などの計算に使えます。

7-3. 現在時刻から過去・未来の日時を求める

過去の日時を求める場合は、負の値を指定します。

C#
DateTime now = DateTime.Now;

DateTime yesterday = now.AddDays(-1);
DateTime oneHourAgo = now.AddHours(-1);
DateTime tenMinutesAgo = now.AddMinutes(-10);

Console.WriteLine(yesterday);
Console.WriteLine(oneHourAgo);
Console.WriteLine(tenMinutesAgo);

未来の日時を求める場合は、正の値を指定します。

C#
DateTime now = DateTime.Now;

DateTime nextWeek = now.AddDays(7);
DateTime nextMonth = now.AddMonths(1);

Console.WriteLine(nextWeek);
Console.WriteLine(nextMonth);

「現在時刻から30分以内」「過去7日間」「登録から1年後」といった条件を作るときに便利です。

7-4. 処理時間や経過時間を計測する方法

処理時間を計測する場合は、DateTime.Nowの差分でも可能ですが、より正確に測りたい場合はStopwatchを使います。

C#
using System;
using System.Diagnostics;
using System.Threading;

class Program
{
static void Main()
{
Stopwatch stopwatch = Stopwatch.StartNew();

Thread.Sleep(1000);

stopwatch.Stop();

Console.WriteLine($"処理時間: {stopwatch.ElapsedMilliseconds} ms");
}
}

Stopwatchは経過時間を正確に測定するためのメソッドやプロパティを提供するクラスです。Microsoftのドキュメントでも、Stopwatchは経過時間を正確に測定するために使うクラスとして説明されています。

処理時間の計測にはDateTime.NowよりStopwatchを使う方が適しています。

8. C#で現在時刻を扱うときの注意点

8-1. DateTime.Nowを何度も呼び出すと値が変わる

DateTime.Nowは呼び出した瞬間の現在時刻を返します。そのため、短いコードの中で複数回呼び出しても、値が微妙に異なる場合があります。

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

同じ処理内で同一の現在時刻を使いたい場合は、最初に変数へ代入します。

C#
DateTime now = DateTime.Now;

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

ログ、DB保存、ファイル名生成などで時刻を統一したい場合は、この書き方が安全です。

8-2. 文字列変換時のカルチャ設定に注意する

DateTime.ToString()をフォーマット指定なしで使うと、実行環境のカルチャ設定に依存します。

C#
DateTime now = DateTime.Now;

Console.WriteLine(now.ToString());

日本語環境、英語環境、サーバー環境で表示が変わる可能性があります。表示形式を固定したい場合は、必ずフォーマットを指定しましょう。

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

さらに日本語表記に固定したい場合は、CultureInfoも指定します。

C#
using System.Globalization;

Console.WriteLine(
now.ToString("yyyy年MM月dd日 dddd HH時mm分ss秒", new CultureInfo("ja-JP"))
);

8-3. 日時比較ではKindプロパティに注意する

DateTimeにはKindプロパティがあります。

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

DateTime.Nowはローカル時刻、DateTime.UtcNowはUTC時刻です。UtcNowの公式ドキュメントでも、Kindプロパティが変換処理に影響する例が示されています。

次のように、ローカル時刻とUTCを混ぜて比較すると、意図しない結果になることがあります。

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

Console.WriteLine(localNow > utcNow);

比較や保存を行う前に、同じ基準へ揃えることが重要です。

C#
DateTime utcNow = DateTime.UtcNow;
DateTime targetUtc = target.ToUniversalTime();

if (utcNow > targetUtc)
{
Console.WriteLine("期限切れです。");
}

8-4. テストしやすいコードにするための考え方

コード内で直接DateTime.Nowを呼び出すと、テストがしにくくなる場合があります。現在時刻は実行するたびに変わるため、テスト結果が安定しないことがあるからです。

たとえば、次のようなコードは現在時刻に依存します。

C#
public bool IsExpired(DateTime expiresAt)
{
return DateTime.Now > expiresAt;
}

テストしやすくするには、現在時刻を外から渡せるようにします。

C#
public bool IsExpired(DateTime now, DateTime expiresAt)
{
return now > expiresAt;
}

呼び出し側でDateTime.Nowを渡します。

C#
bool result = IsExpired(DateTime.Now, expiresAt);

この形にしておくと、テストでは固定日時を指定できます。

C#
DateTime fixedNow = new DateTime(2026, 6, 7, 12, 0, 0);
DateTime expiresAt = new DateTime(2026, 6, 7, 11, 59, 59);

bool result = IsExpired(fixedNow, expiresAt);

時刻に依存する処理では、「現在時刻をどこで取得するか」を意識すると、保守しやすいコードになります。

9. 実務で使える現在時刻の活用例

9-1. ログに現在時刻を出力する

ログには、いつ処理が実行されたかを記録するために現在時刻を出力します。

C#
DateTime now = DateTime.Now;

Console.WriteLine($"[{now:yyyy/MM/dd HH:mm:ss.fff}] 処理を開始しました。");

出力例です。

[2026/06/07 14:35:20.123] 処理を開始しました。

ログではミリ秒まで出しておくと、短時間に複数の処理が実行された場合でも順序を追いやすくなります。

UTCで統一したい場合は、次のようにします。

C#
DateTime utcNow = DateTime.UtcNow;

Console.WriteLine($"[{utcNow:yyyy-MM-ddTHH:mm:ss.fffZ}] 処理を開始しました。");

9-2. ファイル名に現在日時を付ける

バックアップファイルや出力ファイルには、現在日時を含めると管理しやすくなります。

C#
DateTime now = DateTime.Now;

string fileName = $"backup_{now:yyyyMMdd_HHmmss}.txt";

Console.WriteLine(fileName);

出力例です。

backup_20260607_143520.txt

ファイル名では、/:を使わないようにします。yyyyMMdd_HHmmssのようにすると、時系列で並びやすく、ファイル名としても扱いやすいです。

9-3. 画面に現在時刻を表示する

画面に現在時刻を表示する場合は、ユーザーにとって読みやすい形式にします。

C#
DateTime now = DateTime.Now;

string displayText = now.ToString("yyyy年MM月dd日 HH:mm");

Console.WriteLine(displayText);

出力例です。

2026年06月07日 14:35

曜日も含める場合は、次のようにします。

C#
using System.Globalization;

DateTime now = DateTime.Now;
CultureInfo culture = new CultureInfo("ja-JP");

string displayText = now.ToString("yyyy年MM月dd日(dddd)HH:mm", culture);

Console.WriteLine(displayText);

出力例です。

2026年06月07日(日曜日)14:35

ユーザー向けの画面では、ログとは違い、読みやすさを優先して秒やミリ秒を省略することも多いです。

9-4. 更新日時や登録日時を保存する

データベースに登録日時や更新日時を保存する場合にも、現在時刻を使います。

C#
DateTime now = DateTime.UtcNow;

var user = new User
{
Name = "山田太郎",
CreatedAt = now,
UpdatedAt = now
};

登録日時と更新日時に同じ値を入れたい場合は、DateTime.UtcNowを2回呼ぶのではなく、一度変数に代入して使うと値が揃います。

C#
DateTime now = DateTime.UtcNow;

CreatedAt = now;
UpdatedAt = now;

更新処理では、UpdatedAtだけを現在時刻で更新します。

C#
user.Name = "山田花子";
user.UpdatedAt = DateTime.UtcNow;

Webアプリでは、DBにはUTCで保存し、画面表示時に日本時間へ変換する設計がよく使われます。

10. C#の時刻取得でよくあるエラー・疑問

10-1. 現在時刻が想定とずれる原因

現在時刻が想定とずれる場合は、まず次の点を確認しましょう。

確認項目内容
DateTime.NowDateTime.UtcNowローカル時刻とUTCの違い
サーバーのタイムゾーン日本時間かUTCか
Dockerやクラウド環境コンテナや実行環境の設定
DB保存時の変換UTC保存かローカル保存か
表示時の変換画面表示時にタイムゾーン変換しているか

特に「9時間ずれる」場合は、日本時間とUTCの違いが原因であることが多いです。

確認用に次のようなコードを実行すると、現在の状態を把握しやすくなります。

C#
Console.WriteLine($"Now: {DateTime.Now}");
Console.WriteLine($"UtcNow: {DateTime.UtcNow}");
Console.WriteLine($"Local TimeZone: {TimeZoneInfo.Local.Id}");

10-2. AM/PM表記になってしまう場合の対処法

AM/PM表記になってしまう場合は、12時間表記のhhを使っている可能性があります。

C#
DateTime now = DateTime.Now;

Console.WriteLine(now.ToString("hh:mm:ss tt"));

24時間表記にしたい場合は、HHを使います。

C#
Console.WriteLine(now.ToString("HH:mm:ss"));

hhHHの違いは重要です。

指定子表記
hh12時間表記
HH24時間表記

業務システムでは、誤解を避けるためにHH:mm:ssを使うのがおすすめです。

10-3. 秒やミリ秒が表示されない場合の対処法

秒が表示されない場合は、フォーマットにssが含まれているか確認します。

C#
DateTime now = DateTime.Now;

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

ミリ秒まで表示したい場合は、fffを追加します。

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

出力例です。

2026/06/07 14:35:20.123

なお、DateTimeの値としてミリ秒を持っていても、表示フォーマットにfffを指定しなければ表示されません。

10-4. DateTime.NowとDateTimeOffset.Nowはどちらを使うべきか

単純に現在日時を取得して、同じタイムゾーン内で表示・計算するだけならDateTime.Nowで問題ありません。

一方で、UTCからのオフセットも含めて扱いたい場合は、DateTimeOffset.Nowが便利です。

C#
DateTimeOffset now = DateTimeOffset.Now;

Console.WriteLine(now);

出力例です。

2026/06/07 14:35:20 +09:00

+09:00のようにUTCからの差分が含まれるため、「この日時がどのタイムゾーン基準なのか」を表しやすくなります。

使い分けの目安は次のとおりです。

用途おすすめ
簡単なコンソールアプリDateTime.Now
日本国内だけの業務アプリDateTimeまたはDateTimeOffset
APIで日時を返すDateTimeOffsetまたはUTC
DBに登録日時を保存するDateTime.UtcNowまたはDateTimeOffset.UtcNow
海外ユーザー対応DateTimeOffsetTimeZoneInfo
処理時間計測Stopwatch

迷った場合は、保存や通信ではUTCまたはオフセット付き日時、画面表示ではユーザーのタイムゾーンに変換、という方針にすると扱いやすくなります。

まとめ

C#で現在時刻を取得する基本は、DateTime.Nowです。

C#
DateTime now = DateTime.Now;

現在日時を表示するだけなら、次のように書けます。

C#
Console.WriteLine(DateTime.Now);

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

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

日付だけならDateTime.Today、UTCならDateTime.UtcNow、タイムゾーン変換ならTimeZoneInfo、処理時間の計測ならStopwatchを使います。

C#の時刻処理では、次の点を押さえておくことが重要です。

ポイント内容
現在日時の取得DateTime.Now
今日の日付だけDateTime.Today
UTCの現在日時DateTime.UtcNow
表示形式の指定ToString("yyyy/MM/dd HH:mm:ss")
日本語表記CultureInfo("ja-JP")
タイムゾーン変換TimeZoneInfo
経過時間の計測Stopwatch
オフセット付き日時DateTimeOffset

DateTime.Nowは手軽で便利ですが、ローカル時刻に依存します。Webアプリやサーバー処理では、UTCやタイムゾーンを意識して設計することが大切です。

まずはDateTime.NowToStringによるフォーマット指定を理解し、必要に応じてUtcNowTimeZoneInfoDateTimeOffsetを使い分けると、C#の時刻処理を安全に実装できます。