C#で現在時刻を取得する方法|DateTime.Now・UtcNowの違いと日時フォーマット例
はじめに
C#で現在時刻を取得したい場合、基本的にはDateTime.NowやDateTime.UtcNowを使います。たとえば、画面に現在時刻を表示したいとき、ログに日時を残したいとき、ファイル名にタイムスタンプを付けたいときなど、現在時刻を扱う場面は非常に多くあります。
ただし、C#の日時処理では「ローカル時刻」「UTC時刻」「日付のみ」「タイムゾーン付きの時刻」などを正しく使い分けることが大切です。何となくDateTime.Nowを使っていると、サーバー環境や海外ユーザー対応、データベース保存時に時刻のズレが発生することがあります。
この記事では、C#で現在時刻を取得する基本的な方法から、DateTime.Now・DateTime.UtcNow・DateTime.Todayの違い、日時フォーマット、タイムゾーン変換、DateTimeOffsetの使い方まで、コード例付きでわかりやすく解説します。
1. C#で現在時刻を取得する基本方法
C#で現在時刻を取得する代表的な方法は、次の3つです。
C#DateTime now = DateTime.Now;
DateTime utcNow = DateTime.UtcNow;
DateTime today = DateTime.Today;
それぞれ取得できる値が異なります。
DateTime.Nowは実行環境のローカル時刻、DateTime.UtcNowはUTC時刻、DateTime.Todayは今日の日付を取得します。
1-1. 最短で現在時刻を取得するコード例
C#で現在時刻を取得してコンソールに表示する最も簡単なコードは次のとおりです。
C#using System;
class Program
{
static void Main()
{
DateTime now = DateTime.Now;
Console.WriteLine(now);
}
}
実行すると、現在の日時が表示されます。
2026/06/16 14:30:25
表示形式は実行環境のカルチャ設定によって変わる場合があります。特定の形式で表示したい場合は、ToStringでフォーマットを指定します。
C#DateTime now = DateTime.Now;
Console.WriteLine(now.ToString("yyyy/MM/dd HH:mm:ss"));
1-2. DateTime.Nowでローカル時刻を取得する
DateTime.Nowは、現在のローカル時刻を取得するプロパティです。
C#DateTime now = DateTime.Now;
Console.WriteLine(now);
日本の環境で実行している場合は、日本時間の現在時刻が取得されます。
2026/06/16 14:30:25
DateTime.Nowは、次のような用途に向いています。
C#DateTime now = DateTime.Now;
Console.WriteLine($"現在時刻: {now:yyyy/MM/dd HH:mm:ss}");
画面表示やユーザー向けの日時表示など、ローカル時刻をそのまま使いたい場合に便利です。
ただし、サーバーがUTC設定になっている場合や、クラウド環境で実行する場合は、想定している日本時間とは異なる時刻になることがあります。そのため、保存用の時刻としてはDateTime.UtcNowを使うことが多いです。
1-3. DateTime.UtcNowでUTC時刻を取得する
DateTime.UtcNowは、現在のUTC時刻を取得します。
C#DateTime utcNow = DateTime.UtcNow;
Console.WriteLine(utcNow);
UTCは協定世界時のことで、日本時間とは9時間の差があります。日本時間が2026/06/16 14:30:00の場合、UTCは次のようになります。
2026/06/16 05:30:00
DateTime.UtcNowは、次のような用途に向いています。
C#DateTime createdAt = DateTime.UtcNow;
データベースに作成日時を保存する場合や、APIで日時を扱う場合、複数の国や地域で利用されるシステムでは、UTCで保存しておくと扱いやすくなります。
1-4. DateTime.Todayで今日の日付だけを取得する
DateTime.Todayは、現在の日付を取得します。時刻部分は00:00:00になります。
C#DateTime today = DateTime.Today;
Console.WriteLine(today);
出力例は次のとおりです。
2026/06/16 0:00:00
日付だけを比較したい場合や、今日の日付を基準に処理したい場合に便利です。
C#DateTime today = DateTime.Today;
Console.WriteLine(today.ToString("yyyy/MM/dd"));
出力結果は次のようになります。
2026/06/16
ただし、DateTime.Todayもローカル時刻を基準にした日付です。UTC基準の日付が必要な場合は、DateTime.UtcNow.Dateを使います。
C#DateTime utcToday = DateTime.UtcNow.Date;
2. DateTime.Now・UtcNow・Todayの違い
C#で現在時刻を扱うときは、DateTime.Now・DateTime.UtcNow・DateTime.Todayの違いを理解しておく必要があります。
それぞれの違いを簡単にまとめると、次のようになります。
| プロパティ | 取得できる値 | 時刻部分 | 主な用途 |
|---|---|---|---|
DateTime.Now | ローカル現在日時 | あり | 画面表示、ローカル処理 |
DateTime.UtcNow | UTC現在日時 | あり | DB保存、API、ログ |
DateTime.Today | ローカル今日の日付 | 00:00:00 | 日付比較、日単位の処理 |
2-1. DateTime.NowとDateTime.UtcNowの違い
DateTime.NowとDateTime.UtcNowの最大の違いは、取得する時刻の基準です。
C#Console.WriteLine(DateTime.Now);
Console.WriteLine(DateTime.UtcNow);
日本時間の環境では、DateTime.Nowは日本時間、DateTime.UtcNowはUTC時刻を返します。
2026/06/16 14:30:00
2026/06/16 05:30:00
日本時間はUTCより9時間進んでいます。そのため、日本国内のPCで実行すると、多くの場合DateTime.NowとDateTime.UtcNowには9時間の差があります。
ただし、実行環境のタイムゾーンが日本とは限りません。サーバーやDockerコンテナ、クラウド環境ではUTC設定になっていることも多いため、DateTime.Nowが必ず日本時間になるとは限りません。
2-2. DateTime.NowとDateTime.Todayの違い
DateTime.Nowは現在の日付と時刻を取得します。一方、DateTime.Todayは今日の日付だけを取得し、時刻部分は00:00:00になります。
C#DateTime now = DateTime.Now;
DateTime today = DateTime.Today;
Console.WriteLine(now);
Console.WriteLine(today);
出力例は次のとおりです。
2026/06/16 14:30:25
2026/06/16 0:00:00
日付だけを比較したい場合は、DateTime.TodayまたはDateTime.Now.Dateを使います。
C#if (someDate.Date == DateTime.Today)
{
Console.WriteLine("今日の日付です");
}
2-3. ローカル時刻とUTC時刻の使い分け
ローカル時刻は、ユーザーが普段見ている地域の時刻です。日本であれば日本時間、アメリカであれば各地域の現地時刻になります。
一方、UTC時刻は世界共通の基準時刻です。システム内部で日時を保存したり、別の地域のユーザーとデータをやり取りしたりする場合に適しています。
たとえば、ユーザーに表示する日時はローカル時刻、データベースに保存する日時はUTC時刻、という使い分けが一般的です。
C#// 保存用
DateTime savedAt = DateTime.UtcNow;
// 表示用
DateTime localTime = savedAt.ToLocalTime();
Console.WriteLine(localTime.ToString("yyyy/MM/dd HH:mm:ss"));
2-4. どれを使うべきか用途別に比較
用途別に見ると、次のように使い分けるとわかりやすいです。
| 用途 | おすすめ |
|---|---|
| 画面に現在時刻を表示する | DateTime.Now |
| ログをUTCで残す | DateTime.UtcNow |
| データベースに作成日時を保存する | DateTime.UtcNow |
| 今日の日付だけを取得する | DateTime.Today |
| 日付だけを比較する | DateTime.Todayまたは.Date |
| タイムゾーン情報も扱う | DateTimeOffset |
| 特定地域の現在時刻を取得する | TimeZoneInfo |
小規模なローカルアプリではDateTime.Nowでも問題ないことが多いですが、WebアプリやAPI、クラウド環境ではDateTime.UtcNowやDateTimeOffset.UtcNowを使う設計が安全です。
3. 現在時刻を指定した形式で表示する方法
現在時刻をそのまま表示すると、環境によって表示形式が変わることがあります。常に同じ形式で表示したい場合は、ToStringメソッドで日時フォーマットを指定します。
3-1. ToStringで日時をフォーマットする
DateTimeの値は、ToStringにフォーマット文字列を渡すことで、任意の形式に変換できます。
C#DateTime now = DateTime.Now;
string text = now.ToString("yyyy/MM/dd HH:mm:ss");
Console.WriteLine(text);
出力例は次のとおりです。
2026/06/16 14:30:25
yyyyは年、MMは月、ddは日、HHは24時間表記の時、mmは分、ssは秒を表します。
注意点として、月は大文字のMM、分は小文字のmmです。
C#// 正しい例
now.ToString("yyyy/MM/dd HH:mm:ss");
// 間違えやすい例
now.ToString("yyyy/mm/dd HH:MM:ss");
mmを月のつもりで使うと分として扱われ、MMを分のつもりで使うと月として扱われます。
3-2. yyyy/MM/dd HH:mm:ss形式で表示する
実務でよく使われる形式は、yyyy/MM/dd HH:mm:ssです。
C#DateTime now = DateTime.Now;
Console.WriteLine(now.ToString("yyyy/MM/dd HH:mm:ss"));
出力例です。
2026/06/16 14:30:25
ハイフン区切りにしたい場合は、次のように指定します。
C#Console.WriteLine(now.ToString("yyyy-MM-dd HH:mm:ss"));
出力例です。
2026-06-16 14:30:25
ファイル名やログ出力では、区切り文字にスラッシュを使うとパスとして解釈されることがあるため、ハイフンやアンダースコアを使うのが安全です。
C#string timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss");
Console.WriteLine(timestamp);
出力例です。
20260616_143025
3-3. 年月日・時分秒を個別に取得する
現在時刻から年、月、日、時、分、秒を個別に取得することもできます。
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
日: 16
時: 14
分: 30
秒: 25
個別の値を使って条件分岐をしたい場合や、独自の表示形式を組み立てたい場合に便利です。
C#DateTime now = DateTime.Now;
string message = $"{now.Year}年{now.Month}月{now.Day}日 {now.Hour}時{now.Minute}分";
Console.WriteLine(message);
3-4. 日本語表記で現在時刻を表示する
日本語表記で現在時刻を表示する場合は、フォーマット文字列に「年」「月」「日」「時」「分」「秒」を含めます。
C#DateTime now = DateTime.Now;
string text = now.ToString("yyyy年MM月dd日 HH時mm分ss秒");
Console.WriteLine(text);
出力例です。
2026年06月16日 14時30分25秒
月や日をゼロ埋めしたくない場合は、Mやdを使います。
C#Console.WriteLine(now.ToString("yyyy年M月d日 H時m分s秒"));
出力例です。
2026年6月16日 14時30分25秒
ゼロ埋めしたい場合はMMやdd、ゼロ埋めしたくない場合はMやdを使い分けます。
3-5. 曜日を含めて表示する
曜日を含めて現在時刻を表示するには、dddまたはddddを使います。
C#DateTime now = DateTime.Now;
Console.WriteLine(now.ToString("yyyy/MM/dd (ddd) HH:mm:ss"));
出力例です。
2026/06/16 (火) 14:30:25
曜日を日本語で安定して表示したい場合は、CultureInfoを指定します。
C#using System;
using System.Globalization;
class Program
{
static void Main()
{
DateTime now = DateTime.Now;
CultureInfo culture = new CultureInfo("ja-JP");
string text = now.ToString("yyyy年M月d日(dddd) HH時mm分ss秒", culture);
Console.WriteLine(text);
}
}
出力例です。
2026年6月16日(火曜日) 14時30分25秒
dddは短い曜日表記、ddddは長い曜日表記です。
C#Console.WriteLine(now.ToString("ddd", culture)); // 火
Console.WriteLine(now.ToString("dddd", culture)); // 火曜日
4. C#の日時フォーマット指定子一覧
C#では、日時を文字列に変換するときにさまざまなフォーマット指定子を使えます。よく使う指定子を覚えておくと、現在時刻の表示やログ出力、ファイル名作成が簡単になります。
4-1. よく使うカスタム日時フォーマット
よく使うカスタム日時フォーマット指定子は次のとおりです。
| 指定子 | 意味 | 例 |
|---|---|---|
yyyy | 4桁の年 | 2026 |
yy | 2桁の年 | 26 |
MM | 2桁の月 | 06 |
M | 月 | 6 |
dd | 2桁の日 | 16 |
d | 日 | 16 |
HH | 24時間表記の時 | 14 |
H | 24時間表記の時 | 14 |
hh | 12時間表記の時 | 02 |
h | 12時間表記の時 | 2 |
mm | 分 | 30 |
ss | 秒 | 25 |
fff | ミリ秒 | 123 |
tt | AM/PM | 午後 |
ddd | 短い曜日 | 火 |
dddd | 長い曜日 | 火曜日 |
使用例です。
C#DateTime now = DateTime.Now;
Console.WriteLine(now.ToString("yyyy/MM/dd"));
Console.WriteLine(now.ToString("HH:mm:ss"));
Console.WriteLine(now.ToString("yyyyMMddHHmmss"));
Console.WriteLine(now.ToString("yyyy年M月d日 dddd"));
出力例です。
2026/06/16
14:30:25
20260616143025
2026年6月16日 火曜日
4-2. 標準日時フォーマット指定子
C#には、あらかじめ用意された標準日時フォーマット指定子もあります。
C#DateTime now = DateTime.Now;
Console.WriteLine(now.ToString("d"));
Console.WriteLine(now.ToString("D"));
Console.WriteLine(now.ToString("t"));
Console.WriteLine(now.ToString("T"));
Console.WriteLine(now.ToString("f"));
Console.WriteLine(now.ToString("F"));
Console.WriteLine(now.ToString("s"));
Console.WriteLine(now.ToString("o"));
代表的な標準フォーマットは次のとおりです。
| 指定子 | 内容 | 例 |
|---|---|---|
d | 短い日付 | 2026/06/16 |
D | 長い日付 | 2026年6月16日 |
t | 短い時刻 | 14:30 |
T | 長い時刻 | 14:30:25 |
f | 長い日付と短い時刻 | 2026年6月16日 14:30 |
F | 長い日付と長い時刻 | 2026年6月16日 14:30:25 |
s | ソート可能な日時 | 2026-06-16T14:30:25 |
o | ラウンドトリップ日時 | 2026-06-16T14:30:25.1234567+09:00 |
標準フォーマットは環境のカルチャに影響されるものがあります。APIやログなどで形式を固定したい場合は、カスタムフォーマットを使うことが多いです。
4-3. 24時間表記と12時間表記の違い
24時間表記を使う場合はHH、12時間表記を使う場合はhhを指定します。
C#DateTime now = DateTime.Now;
Console.WriteLine(now.ToString("HH:mm:ss"));
Console.WriteLine(now.ToString("hh:mm:ss tt"));
出力例です。
14:30:25
02:30:25 午後
HHは0時から23時までの表記です。hhは1時から12時までの表記で、午前・午後を表すにはttを組み合わせます。
C#Console.WriteLine(now.ToString("yyyy/MM/dd HH:mm"));
Console.WriteLine(now.ToString("yyyy/MM/dd hh:mm tt"));
ログやデータ保存では、誤解が少ない24時間表記のHH:mm:ssがよく使われます。
4-4. ミリ秒まで表示する方法
ミリ秒まで表示したい場合は、fffを使います。
C#DateTime now = DateTime.Now;
Console.WriteLine(now.ToString("yyyy/MM/dd HH:mm:ss.fff"));
出力例です。
2026/06/16 14:30:25.123
より細かい桁まで表示したい場合は、fffffffを使うこともできます。
C#Console.WriteLine(now.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
出力例です。
2026/06/16 14:30:25.1234567
ただし、実際の精度はOSや実行環境に依存します。処理時間を正確に計測したい場合は、DateTime.NowではなくStopwatchを使うのが一般的です。
5. タイムゾーンを考慮して現在時刻を扱う方法
C#で現在時刻を扱うとき、タイムゾーンを意識することは非常に重要です。特にWebアプリ、API、クラウド環境、海外ユーザー対応のシステムでは、ローカル時刻とUTC時刻を正しく変換する必要があります。
5-1. UTC時刻をローカル時刻に変換する
UTC時刻をローカル時刻に変換するには、ToLocalTimeを使います。
C#DateTime utcNow = DateTime.UtcNow;
DateTime localTime = utcNow.ToLocalTime();
Console.WriteLine(utcNow);
Console.WriteLine(localTime);
日本時間の環境で実行すると、UTC時刻に9時間加算された時刻が表示されます。
2026/06/16 05:30:00
2026/06/16 14:30:00
データベースにはUTCで保存し、画面表示時にローカル時刻へ変換する、という設計でよく使われます。
C#DateTime savedUtc = DateTime.UtcNow;
DateTime displayTime = savedUtc.ToLocalTime();
Console.WriteLine(displayTime.ToString("yyyy/MM/dd HH:mm:ss"));
5-2. ローカル時刻をUTC時刻に変換する
ローカル時刻をUTC時刻に変換するには、ToUniversalTimeを使います。
C#DateTime localTime = DateTime.Now;
DateTime utcTime = localTime.ToUniversalTime();
Console.WriteLine(localTime);
Console.WriteLine(utcTime);
日本時間の環境では、ローカル時刻から9時間引かれたUTC時刻になります。
2026/06/16 14:30:00
2026/06/16 05:30:00
ユーザーが入力したローカル日時をUTCに変換して保存したい場合などに使います。
C#DateTime inputLocalTime = new DateTime(2026, 6, 16, 14, 30, 0);
DateTime utcTime = inputLocalTime.ToUniversalTime();
ただし、DateTimeKindが正しく設定されていないと、意図しない変換になることがあります。タイムゾーンを厳密に扱う場合は、DateTimeOffsetやTimeZoneInfoの利用も検討しましょう。
5-3. TimeZoneInfoで特定地域の現在時刻を取得する
特定のタイムゾーンの現在時刻を取得するには、TimeZoneInfoを使います。
C#DateTime utcNow = DateTime.UtcNow;
TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
DateTime japanTime = TimeZoneInfo.ConvertTimeFromUtc(utcNow, timeZone);
Console.WriteLine(japanTime);
Windows環境では、日本時間のタイムゾーンIDとして"Tokyo Standard Time"を使います。
C#TimeZoneInfo japanTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
Linux環境では、"Asia/Tokyo"を使うケースがあります。
C#TimeZoneInfo japanTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Asia/Tokyo");
実行環境によって利用できるタイムゾーンIDが異なる場合があるため、WindowsとLinuxの両方で動作させる場合は注意が必要です。
5-4. 日本時間を取得するコード例
日本時間の現在時刻を明示的に取得するコード例です。
C#using System;
class Program
{
static void Main()
{
DateTime utcNow = DateTime.UtcNow;
TimeZoneInfo japanTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
DateTime japanTime = TimeZoneInfo.ConvertTimeFromUtc(utcNow, japanTimeZone);
Console.WriteLine(japanTime.ToString("yyyy/MM/dd HH:mm:ss"));
}
}
Windows環境ではこのコードで日本時間を取得できます。
Linux環境も考慮する場合は、次のように環境に応じてタイムゾーンIDを切り替える方法があります。
C#using System;
using System.Runtime.InteropServices;
class Program
{
static void Main()
{
string timeZoneId = RuntimeInformation.IsOSPlatform(OSPlatform.Windows)
? "Tokyo Standard Time"
: "Asia/Tokyo";
TimeZoneInfo japanTimeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
DateTime japanTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, japanTimeZone);
Console.WriteLine(japanTime.ToString("yyyy/MM/dd HH:mm:ss"));
}
}
サーバーのローカルタイムゾーンに依存せず、日本時間を取得したい場合に便利です。
6. DateTimeOffsetで現在時刻を取得する方法
DateTimeOffsetは、日時に加えてUTCからのオフセット情報を持つ型です。タイムゾーンや時差を意識した日時を扱いたい場合は、DateTimeよりもDateTimeOffsetの方が適していることがあります。
6-1. DateTimeOffset.Nowの使い方
DateTimeOffset.Nowを使うと、ローカル時刻とUTCオフセットを含む現在日時を取得できます。
C#DateTimeOffset now = DateTimeOffset.Now;
Console.WriteLine(now);
日本時間の環境では、次のような形式で表示されます。
2026/06/16 14:30:25 +09:00
+09:00はUTCから9時間進んでいることを表します。
フォーマットして表示することもできます。
C#DateTimeOffset now = DateTimeOffset.Now;
Console.WriteLine(now.ToString("yyyy/MM/dd HH:mm:ss zzz"));
出力例です。
2026/06/16 14:30:25 +09:00
6-2. DateTimeOffset.UtcNowの使い方
DateTimeOffset.UtcNowを使うと、UTCの現在日時を取得できます。
C#DateTimeOffset utcNow = DateTimeOffset.UtcNow;
Console.WriteLine(utcNow);
出力例です。
2026/06/16 05:30:25 +00:00
UTCオフセットは+00:00になります。
データベース保存やAPI連携では、DateTimeOffset.UtcNowを使うと、UTCであることが明確になります。
C#DateTimeOffset createdAt = DateTimeOffset.UtcNow;
Unix時間を取得したい場合にも便利です。
C#long unixTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
Console.WriteLine(unixTime);
6-3. DateTimeとDateTimeOffsetの違い
DateTimeとDateTimeOffsetの大きな違いは、オフセット情報を持つかどうかです。
| 型 | 特徴 | 例 |
|---|---|---|
DateTime | 日時を表す | 2026/06/16 14:30:25 |
DateTimeOffset | 日時とUTCオフセットを表す | 2026/06/16 14:30:25 +09:00 |
DateTimeにもKindという情報がありますが、タイムゾーンそのものを表すわけではありません。
C#DateTime now = DateTime.Now;
Console.WriteLine(now.Kind);
出力例です。
Local
一方、DateTimeOffsetでは、UTCから何時間ずれているかを値として保持できます。
C#DateTimeOffset now = DateTimeOffset.Now;
Console.WriteLine(now.Offset);
出力例です。
09:00:00
日時データの保存や外部システムとのやり取りでは、DateTimeOffsetの方が意図を明確にしやすいです。
6-4. タイムゾーン情報を含めたい場合の選び方
タイムゾーンやオフセットを考慮したい場合は、次のように選ぶとよいでしょう。
| 用途 | おすすめ |
|---|---|
| 単純に現在時刻を表示したい | DateTime.Now |
| UTCで保存したい | DateTime.UtcNow |
| UTCオフセットも保存したい | DateTimeOffset.UtcNow |
| ユーザーの現地時刻をオフセット付きで扱いたい | DateTimeOffset.Now |
| 特定地域の時刻に変換したい | TimeZoneInfo |
たとえば、Web APIで日時を返す場合は、UTCまたはオフセット付きの形式にしておくと、クライアント側で解釈しやすくなります。
C#DateTimeOffset now = DateTimeOffset.UtcNow;
Console.WriteLine(now.ToString("o"));
出力例です。
2026-06-16T05:30:25.1234567+00:00
7. 現在時刻を使う実践的なコード例
ここでは、C#で現在時刻を使う実践的なコード例を紹介します。ログ出力、ファイル名作成、処理時間の計測、データベース保存、ASP.NETでの表示など、実務でよく使うパターンです。
7-1. ログに現在時刻を出力する
ログに現在時刻を出力する場合は、日時フォーマットを固定しておくと読みやすくなります。
C#DateTime now = DateTime.Now;
Console.WriteLine($"[{now:yyyy-MM-dd HH:mm:ss}] 処理を開始しました");
出力例です。
[2026-06-16 14:30:25] 処理を開始しました
サーバーアプリケーションでは、UTCでログを残すこともあります。
C#DateTime utcNow = DateTime.UtcNow;
Console.WriteLine($"[{utcNow:yyyy-MM-dd HH:mm:ss} UTC] 処理を開始しました");
複数のタイムゾーンにまたがるシステムでは、ログの時刻をUTCに統一しておくと、障害調査や時系列の確認がしやすくなります。
7-2. ファイル名に現在日時を付ける
ファイル名に現在日時を付ける場合は、スラッシュやコロンを使わない形式にします。スラッシュやコロンは、ファイル名に使えない環境があるためです。
C#DateTime now = DateTime.Now;
string fileName = $"log_{now:yyyyMMdd_HHmmss}.txt";
Console.WriteLine(fileName);
出力例です。
log_20260616_143025.txt
バックアップファイルやCSV出力ファイルにもよく使われます。
C#string csvFileName = $"sales_{DateTime.Now:yyyyMMdd_HHmmss}.csv";
ミリ秒まで含めたい場合は、fffを追加します。
C#string fileName = $"log_{DateTime.Now:yyyyMMdd_HHmmss_fff}.txt";
出力例です。
log_20260616_143025_123.txt
7-3. 処理時間を計測する
処理時間を計測する場合は、DateTime.NowではなくStopwatchを使うのがおすすめです。
C#using System;
using System.Diagnostics;
using System.Threading;
class Program
{
static void Main()
{
Stopwatch stopwatch = Stopwatch.StartNew();
Thread.Sleep(1500);
stopwatch.Stop();
Console.WriteLine($"処理時間: {stopwatch.ElapsedMilliseconds}ミリ秒");
}
}
出力例です。
処理時間: 1502ミリ秒
開始時刻と終了時刻を表示したい場合は、DateTime.Nowと組み合わせてもよいです。
C#DateTime startTime = DateTime.Now;
Console.WriteLine($"開始時刻: {startTime:yyyy/MM/dd HH:mm:ss}");
// 何らかの処理
DateTime endTime = DateTime.Now;
Console.WriteLine($"終了時刻: {endTime:yyyy/MM/dd HH:mm:ss}");
Console.WriteLine($"経過時間: {(endTime - startTime).TotalSeconds}秒");
ただし、正確な処理時間の計測にはStopwatchの方が適しています。
7-4. 現在時刻をデータベースに保存する
データベースに現在時刻を保存する場合は、UTCで保存する設計がよく使われます。
C#DateTime createdAt = DateTime.UtcNow;
たとえば、Entity Frameworkで作成日時を設定する場合は次のように書けます。
C#var user = new User
{
Name = "Taro",
CreatedAt = DateTime.UtcNow
};
更新日時も同様です。
C#user.UpdatedAt = DateTime.UtcNow;
表示するときに日本時間へ変換します。
C#DateTime japanTime = user.CreatedAt.ToLocalTime();
Console.WriteLine(japanTime.ToString("yyyy/MM/dd HH:mm:ss"));
ただし、サーバーのローカルタイムゾーンに依存したくない場合は、TimeZoneInfoで明示的に日本時間へ変換する方が安全です。
C#TimeZoneInfo japanTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
DateTime japanTime = TimeZoneInfo.ConvertTimeFromUtc(user.CreatedAt, japanTimeZone);
7-5. ASP.NETで現在時刻を表示する
ASP.NET Coreのコントローラーで現在時刻を表示する例です。
C#using Microsoft.AspNetCore.Mvc;
public class HomeController : Controller
{
public IActionResult Index()
{
ViewBag.Now = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
return View();
}
}
Razorビューでは、次のように表示できます。
cshtml<p>現在時刻: @ViewBag.Now</p>
UTCで取得してから日本時間に変換して表示する場合は、次のように書けます。
C#public IActionResult Index()
{
DateTime utcNow = DateTime.UtcNow;
TimeZoneInfo japanTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
DateTime japanTime = TimeZoneInfo.ConvertTimeFromUtc(utcNow, japanTimeZone);
ViewBag.Now = japanTime.ToString("yyyy/MM/dd HH:mm:ss");
return View();
}
ASP.NETアプリはサーバー環境によってタイムゾーンが異なることがあるため、日本時間で表示したい場合はタイムゾーンを明示するのが安全です。
8. C#で現在時刻を扱うときの注意点
C#で現在時刻を扱う処理は簡単に見えますが、実務では時刻のズレやタイムゾーンの違いが問題になることがあります。ここでは、特に注意したいポイントを解説します。
8-1. サーバー環境ではUtcNowを使うべき理由
サーバー環境では、DateTime.NowよりもDateTime.UtcNowを使うことが推奨される場面が多いです。
理由は、サーバーのタイムゾーンが必ずしも日本時間とは限らないためです。クラウド環境やDockerコンテナでは、OSのタイムゾーンがUTCになっていることがあります。
C#DateTime now = DateTime.Now;
DateTime utcNow = DateTime.UtcNow;
ローカル開発環境ではDateTime.Nowが日本時間を返していても、本番サーバーでは異なる時刻になる可能性があります。
データベース保存やログ、APIの日時にはUTCを使い、ユーザーに表示するときだけローカル時刻へ変換する設計が安全です。
C#// 保存
DateTime createdAt = DateTime.UtcNow;
// 表示
DateTime displayTime = createdAt.ToLocalTime();
8-2. 夏時間やタイムゾーン差によるズレ
海外向けのシステムでは、夏時間にも注意が必要です。地域によっては、季節によってUTCとの時差が変わります。
たとえば、単純に「UTCに9時間足す」「UTCから5時間引く」といった処理を書くと、夏時間がある地域ではズレが発生する可能性があります。
C#// 非推奨になりやすい例
DateTime localTime = DateTime.UtcNow.AddHours(9);
日本時間は基本的に夏時間がないため、AddHours(9)でも結果が合うことは多いですが、タイムゾーン変換としてはTimeZoneInfoを使う方が適切です。
C#TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
DateTime japanTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, timeZone);
海外のタイムゾーンを扱う場合は、固定の時差ではなく、タイムゾーン情報を使って変換しましょう。
8-3. DateTimeKindの違い
DateTimeには、Kindというプロパティがあります。これは、その日時がローカル時刻なのか、UTCなのか、未指定なのかを表します。
C#DateTime localNow = DateTime.Now;
DateTime utcNow = DateTime.UtcNow;
DateTime unspecified = new DateTime(2026, 6, 16, 14, 30, 0);
Console.WriteLine(localNow.Kind);
Console.WriteLine(utcNow.Kind);
Console.WriteLine(unspecified.Kind);
出力例です。
Local
Utc
Unspecified
DateTimeKindには次の3種類があります。
| Kind | 意味 |
|---|---|
Local | ローカル時刻 |
Utc | UTC時刻 |
Unspecified | 種類が未指定 |
KindがUnspecifiedの場合、ToUniversalTimeやToLocalTimeで意図しない変換になることがあります。
C#DateTime date = new DateTime(2026, 6, 16, 14, 30, 0);
Console.WriteLine(date.Kind); // Unspecified
日時を生成するときに種類を明示したい場合は、コンストラクタでDateTimeKindを指定できます。
C#DateTime utcTime = new DateTime(2026, 6, 16, 5, 30, 0, DateTimeKind.Utc);
DateTime localTime = new DateTime(2026, 6, 16, 14, 30, 0, DateTimeKind.Local);
8-4. テストしやすい現在時刻の扱い方
コード内で直接DateTime.NowやDateTime.UtcNowを呼び出すと、テストがしにくくなることがあります。
たとえば、次のようなコードは、実行する時刻によって結果が変わります。
C#public bool IsExpired(DateTime expiresAt)
{
return expiresAt < DateTime.UtcNow;
}
テストしやすくするには、現在時刻を外から渡すようにします。
C#public bool IsExpired(DateTime expiresAt, DateTime now)
{
return expiresAt < now;
}
呼び出し側で現在時刻を渡します。
C#bool expired = IsExpired(expiresAt, DateTime.UtcNow);
より本格的には、現在時刻を取得するためのインターフェースを用意する方法もあります。
C#public interface IClock
{
DateTime UtcNow { get; }
}
public class SystemClock : IClock
{
public DateTime UtcNow => DateTime.UtcNow;
}
テスト時には固定の時刻を返す実装に差し替えられます。
C#public class FixedClock : IClock
{
public DateTime UtcNow { get; }
public FixedClock(DateTime utcNow)
{
UtcNow = utcNow;
}
}
現在時刻に依存する処理では、テストしやすさを考えて設計することが大切です。
8-5. 現在時刻がずれる場合の確認ポイント
C#で現在時刻がずれる場合は、次の点を確認しましょう。
| 確認項目 | 内容 |
|---|---|
| OSのタイムゾーン | サーバーやPCのタイムゾーン設定が正しいか |
| UTCとローカルの混在 | NowとUtcNowを混在させていないか |
| DateTimeKind | Local、Utc、Unspecifiedが意図通りか |
| DB保存形式 | UTCで保存しているか、ローカルで保存しているか |
| 表示時の変換 | UTCを表示前にローカル時刻へ変換しているか |
| Dockerやクラウド環境 | 実行環境のタイムゾーンがUTCになっていないか |
| タイムゾーンID | WindowsとLinuxでIDの違いがないか |
特に多い原因は、UTCで保存した時刻をローカル時刻として表示してしまうケースです。
C#DateTime utcTime = DateTime.UtcNow;
// UTCのまま表示している
Console.WriteLine(utcTime.ToString("yyyy/MM/dd HH:mm:ss"));
日本時間として表示したい場合は、変換してから表示します。
C#DateTime localTime = utcTime.ToLocalTime();
Console.WriteLine(localTime.ToString("yyyy/MM/dd HH:mm:ss"));
または、TimeZoneInfoで日本時間に変換します。
C#TimeZoneInfo japanTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
DateTime japanTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, japanTimeZone);
9. C#の現在時刻に関するよくある質問
ここでは、C#で現在時刻を扱うときによくある質問に回答します。
9-1. 現在時刻だけを取得するには?
日付ではなく現在時刻だけを扱いたい場合は、DateTime.Now.TimeOfDayを使います。
C#TimeSpan currentTime = DateTime.Now.TimeOfDay;
Console.WriteLine(currentTime);
出力例です。
14:30:25.1234567
表示用に時刻だけを文字列にしたい場合は、ToStringで時刻部分だけを指定します。
C#string timeText = DateTime.Now.ToString("HH:mm:ss");
Console.WriteLine(timeText);
出力例です。
14:30:25
.NET 6以降では、日付を持たない時刻専用の型としてTimeOnlyも使えます。
C#TimeOnly timeOnly = TimeOnly.FromDateTime(DateTime.Now);
Console.WriteLine(timeOnly);
9-2. 現在の日付だけを取得するには?
現在の日付だけを取得するには、DateTime.Todayを使います。
C#DateTime today = DateTime.Today;
Console.WriteLine(today.ToString("yyyy/MM/dd"));
出力例です。
2026/06/16
DateTime.Now.Dateでも日付だけを取得できます。
C#DateTime today = DateTime.Now.Date;
どちらも時刻部分は00:00:00になります。
C#Console.WriteLine(DateTime.Today);
Console.WriteLine(DateTime.Now.Date);
日付だけの型を使いたい場合、.NET 6以降ではDateOnlyも利用できます。
C#DateOnly today = DateOnly.FromDateTime(DateTime.Now);
Console.WriteLine(today);
9-3. Unix時間を取得するには?
Unix時間を取得するには、DateTimeOffset.UtcNowを使うのが簡単です。
C#long unixTimeSeconds = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
Console.WriteLine(unixTimeSeconds);
ミリ秒単位のUnix時間を取得したい場合は、ToUnixTimeMillisecondsを使います。
C#long unixTimeMilliseconds = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
Console.WriteLine(unixTimeMilliseconds);
Unix時間から日時に変換することもできます。
C#long unixTime = 1781597425;
DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeSeconds(unixTime);
Console.WriteLine(dateTimeOffset.UtcDateTime);
日本時間で表示したい場合は、ローカル時刻へ変換します。
C#DateTime localTime = dateTimeOffset.LocalDateTime;
Console.WriteLine(localTime.ToString("yyyy/MM/dd HH:mm:ss"));
9-4. UTCではなく日本時間で取得するには?
日本時間を取得したい場合、実行環境が日本時間に設定されているならDateTime.Nowで取得できます。
C#DateTime japanTime = DateTime.Now;
ただし、サーバー環境ではローカルタイムゾーンが日本時間とは限りません。日本時間を明示的に取得したい場合は、TimeZoneInfoを使います。
C#DateTime utcNow = DateTime.UtcNow;
TimeZoneInfo japanTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
DateTime japanTime = TimeZoneInfo.ConvertTimeFromUtc(utcNow, japanTimeZone);
Console.WriteLine(japanTime.ToString("yyyy/MM/dd HH:mm:ss"));
Linux環境では"Asia/Tokyo"を使う場合があります。
C#TimeZoneInfo japanTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Asia/Tokyo");
WindowsとLinuxの両方で動かす場合は、OSごとにタイムゾーンIDを切り替える方法が安全です。
9-5. DateTime.Nowは非推奨なのか?
DateTime.Now自体は非推奨ではありません。現在もC#でローカル時刻を取得するために使えます。
ただし、用途によってはDateTime.NowよりもDateTime.UtcNowやDateTimeOffset.UtcNowを使った方が適切です。
たとえば、次のような用途ではDateTime.Nowでも問題ありません。
C#Console.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
ユーザーの画面に現在時刻を表示する、ローカルアプリで簡単な日時を扱う、といったケースです。
一方、次のような用途ではUTCを使う方が安全です。
C#DateTime createdAt = DateTime.UtcNow;
データベース保存、ログ、API、複数地域で利用されるシステムでは、UTCで保存して表示時に変換する設計がよく使われます。
つまり、DateTime.Nowが非推奨なのではなく、保存用・連携用・サーバー処理ではUTCやDateTimeOffsetを選ぶべき場面が多い、という理解が正確です。
まとめ
C#で現在時刻を取得するには、基本的にDateTime.Now、DateTime.UtcNow、DateTime.Todayを使います。
DateTime.Nowはローカルの現在時刻、DateTime.UtcNowはUTCの現在時刻、DateTime.Todayは今日の日付だけを取得します。
C#DateTime now = DateTime.Now;
DateTime utcNow = DateTime.UtcNow;
DateTime today = DateTime.Today;
画面表示などローカル時刻を使いたい場合はDateTime.Now、データベース保存やAPI、ログなどではDateTime.UtcNowを使うと安全です。日付だけを扱いたい場合はDateTime.Todayや.Dateを使います。
現在時刻を指定形式で表示したい場合は、ToStringでフォーマットを指定します。
C#Console.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
日本時間や特定地域の時刻を明示的に扱いたい場合は、TimeZoneInfoを使います。
C#TimeZoneInfo japanTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
DateTime japanTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, japanTimeZone);
また、UTCオフセットを含めて日時を扱いたい場合は、DateTimeOffsetが便利です。
C#DateTimeOffset now = DateTimeOffset.Now;
DateTimeOffset utcNow = DateTimeOffset.UtcNow;
C#で現在時刻を扱うときは、単にDateTime.Nowを使うだけでなく、「表示用なのか」「保存用なのか」「UTCで扱うべきなのか」「タイムゾーンを考慮する必要があるのか」を意識することが大切です。用途に応じて適切な型とプロパティを選ぶことで、時刻のズレやタイムゾーンの問題を防ぎやすくなります。

