DateTime.Now / DateTime.Today
| 対応: | C# 1.0(2002) |
|---|
現在の日時を取得する『DateTime.Now』と、今日の日付(時刻は 00:00:00)を取得する『DateTime.Today』です。
構文
// 現在の日時(ローカル時刻)を取得します。 DateTime dt = DateTime.Now; // 今日の日付(時刻は 00:00:00)を取得します。 DateTime dt = DateTime.Today; // UTC 現在時刻を取得します。 DateTime dt = DateTime.UtcNow;
メンバー一覧
| メンバー | 概要 |
|---|---|
| DateTime.Now | 現在のローカル日時(年月日・時分秒)を返します。 |
| DateTime.Today | 今日の日付を返します。時刻部分は 00:00:00 になります。 |
| DateTime.UtcNow | 現在の UTC 日時を返します。サーバーサイド処理やログに使われます。 |
| .Year / .Month / .Day | 年・月・日を整数で取得します。 |
| .Hour / .Minute / .Second | 時・分・秒を整数で取得します。 |
| .DayOfWeek | 曜日を DayOfWeek 列挙型で返します(例:DayOfWeek.Monday)。 |
サンプルコード
Program.cs
using System;
// 現在の日時を取得します。
DateTime now = DateTime.Now;
Console.WriteLine(now); // 例: 2024/01/15 14:30:45
// 今日の日付(時刻なし)を取得します。
DateTime today = DateTime.Today;
Console.WriteLine(today); // 例: 2024/01/15 0:00:00
// 各プロパティで個別に取得します。
Console.WriteLine($"年: {now.Year}");
Console.WriteLine($"月: {now.Month}");
Console.WriteLine($"日: {now.Day}");
Console.WriteLine($"時: {now.Hour}");
Console.WriteLine($"分: {now.Minute}");
Console.WriteLine($"秒: {now.Second}");
// 曜日を取得します。
Console.WriteLine($"曜日: {now.DayOfWeek}");
// 日本語で曜日を表示します。
string[] dayNames = { "日", "月", "火", "水", "木", "金", "土" };
Console.WriteLine($"曜日(日本語): {dayNames[(int)now.DayOfWeek]}曜日");
// UTC 時刻を取得します。
DateTime utc = DateTime.UtcNow;
Console.WriteLine($"UTC: {utc}");
コンパイルして実行すると次のようになります。
dotnet script datetime_now_today.csx 2024/01/15 14:30:45 2024/01/15 0:00:00 年: 2024 月: 1 日: 15 時: 14 分: 30 秒: 45 曜日: Monday 曜日(日本語): 月曜日 UTC: 2024/01/15 5:30:45
実践パターン: 日付の比較と判定
DateTime 同士は比較演算子(<、>、==)で直接比較できます。誕生日チェックや有効期限の判定などに使います。
DateComparison.cs
using System;
// 誕生日: Okabe Rintaro (2024-12-14 生まれと仮定)
DateTime birthday = new DateTime(2000, 12, 14);
DateTime today = DateTime.Today;
// 誕生日かどうかを判定します。
bool isBirthday = today.Month == birthday.Month && today.Day == birthday.Day;
Console.WriteLine($"今日は誕生日: {isBirthday}");
// 年齢を計算します。
int age = today.Year - birthday.Year;
if (today < birthday.AddYears(age))
age--;
Console.WriteLine($"年齢: {age} 歳");
// 期限切れチェック(有効期限が今日より前かどうか)
DateTime expiry = new DateTime(2024, 3, 31);
bool isExpired = expiry < today;
Console.WriteLine($"期限切れ: {isExpired}");
// 最大値・最小値を使った未設定チェック
DateTime lastLogin = DateTime.MinValue;
if (lastLogin == DateTime.MinValue)
Console.WriteLine("未ログイン");
コンパイルして実行すると次のようになります。
dotnet script date_comparison.csx 今日は誕生日: False 年齢: 23 歳 期限切れ: True 未ログイン
実践パターン: タイムゾーンを考慮した日時処理
サーバーサイドでは UTC で保存し、表示時にローカル時刻に変換するのが一般的です。
TimeZoneExample.cs
using System;
// ログ保存・DB記録には UtcNow を使います。
DateTime utcNow = DateTime.UtcNow;
Console.WriteLine($"UTC(保存用): {utcNow:yyyy-MM-dd HH:mm:ss}");
// 表示時に JST(UTC+9)に変換します。
TimeZoneInfo jst = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
DateTime jstNow = TimeZoneInfo.ConvertTimeFromUtc(utcNow, jst);
Console.WriteLine($"JST(表示用): {jstNow:yyyy-MM-dd HH:mm:ss}");
// DateTimeOffset を使うとタイムゾーン情報を含めて扱えます。
DateTimeOffset now = DateTimeOffset.UtcNow;
DateTimeOffset jstOffset = now.ToOffset(TimeSpan.FromHours(9));
Console.WriteLine($"DateTimeOffset JST: {jstOffset:yyyy-MM-dd HH:mm:ss zzz}");
コンパイルして実行すると次のようになります。
dotnet script timezone_example.csx UTC(保存用): 2024-01-15 05:30:45 JST(表示用): 2024-01-15 14:30:45 DateTimeOffset JST: 2024-01-15 14:30:45 +09:00
よくあるミス
よくあるミス1: DateTime.Now を複数回呼ぶ
『DateTime.Now』は呼び出しごとに現在時刻を取得します。複数回呼ぶと微妙に時刻がずれるため、一度変数に保存してから使います。
using System;
// NG: 2回呼ぶと「開始」と「完了」でわずかに時刻が変わります。
Console.WriteLine($"開始: {DateTime.Now}");
// ...何らかの処理...
Console.WriteLine($"完了: {DateTime.Now}");
// OK: 変数に保存してから使います。
DateTime start = DateTime.Now;
Console.WriteLine($"開始: {start}");
// ...何らかの処理...
Console.WriteLine($"完了: {start}"); // 同じ時刻を表示します。
よくあるミス2: DateTime.Today と DateTime.Now の混同
日付だけで比較したいときに DateTime.Now を使うと時刻部分が含まれるため、「同じ日かどうか」の比較が正しく動かないことがあります。
using System;
DateTime targetDate = new DateTime(2024, 1, 15); // 時刻なし
// NG: DateTime.Now には時刻が含まれるため == で比較できません。
bool wrong = DateTime.Now == targetDate; // 時刻が 00:00:00 でないと false
// OK: 日付だけで比較するには DateTime.Today を使います。
bool correct = DateTime.Today == targetDate; // 時刻なしで比較します。
Console.WriteLine($"今日: {correct}");
// または .Date プロパティで時刻を切り捨てます。
bool alsoCorrect = DateTime.Now.Date == targetDate;
Console.WriteLine($"Now.Date: {alsoCorrect}");
概要
『DateTime.Now』と『DateTime.Today』はどちらも静的プロパティです。呼び出すたびに現在時刻を取得するため、同じ処理内で複数回使いたい場合は変数に保存してから使います。
ログの記録やデータベースへの保存には、タイムゾーンの影響を受けない『DateTime.UtcNow』が使われます。日時の書式を変えて文字列化するには『日時.ToString() / 日時.AddDays()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。