日付と時刻を 1 本で扱う値型 ― DateTime / System.DateTime 構造体

C# の DateTime は「日時」を 1 つの 64 bit 値Ticks: 100 ns 単位)で表す 値型(struct) です。

  • イミュータブルなので、加算・減算メソッドは必ず “新しい DateTime” を返します。
  • 「いつの時刻か」を示す Kind(Unspecified / Local / Utc)フィールドを内部に持ちます。

よく使う “生成・取得” メンバ

プロパティ / メソッド役割
NowDateTimeローカル時刻(PC のタイムゾーン)var now = DateTime.Now;
UtcNowDateTime協定世界時var utc = DateTime.UtcNow;
TodayDateTime0:00:00 付き今日の日付var today = DateTime.Today;
Date(int y, int m, int d)ctor指定日 0:00 作成new DateTime(2025, 7, 22);
Parse( string ) / TryParseDateTime / bool文字列→日時DateTime.Parse(“2025-07-22")
FromFileTimeUtc(long)DateTimeWindows FileTime→日時

失敗しうる変換は TryParse を推奨(bool ok = DateTime.TryParse(…))。


代表的なプロパティ

プロパティ内容例 (2025-07-22 08:15:30)
Year / Month / Dayint年・月・日2025 / 7 / 22
Hour / Minute / Secondint時・分・秒8 / 15 / 30
DayOfWeekDayOfWeek曜日 enumDayOfWeek.Tuesday
DayOfYearint1‒366 日目203
Tickslong0001/1/1 0:00:00 からの 100 ns 数
KindDateTimeKind時刻の基準Local

日時計算・差分

分類メソッド概要
加算AddDays(d) / AddHours(h) / Add(…)指定量だけ進めるnow.AddDays(7)
減算上記に負数を渡す1 週間前now.AddDays(-7)
差分Subtract(DateTime)2 点の差を TimeSpan で返すvar span = A.Subtract(B);
比較Compare(a,b) / >= 演算子前後関係を判定if (start < end) …
日付のみDate (プロパティ)時間部を 0:00 にdt.Date

TimeSpan は「長さ」を表す構造体。TotalDays / TotalSeconds 等が便利。


書式化 & 解析(文字列⇄日時)

メンバ説明
ToString()文化依存の既定書式dt.ToString()
ToString(“yyyy/MM/dd HH:mm")カスタム書式文字列2025/07/22 08:15
ToString(“o")ISO 8601(ラウンドトリップ)2025-07-22T08:15:30.0000000+09:00
ParseExact(str, fmt, culture)書式を固定して解析“22-07-25".ParseExact(“dd-MM-yy")

DateTime vs DateTimeOffset

項目DateTimeDateTimeOffset
Kind フラグLocal / Utc / Unspecified代わりに タイムゾーン差 (±hh:mm) を保持
演算Kind が異なると注意(暗黙変換なし)どの地域でも “同じ瞬間” を保証
推奨場面ローカル日付のみ(誕生日など)レガシー API と互換ログ時刻・DB など地理横断のタイムスタンプ

よくある落とし穴と対策

シーンつまずきヒント
夏時間 (DST)AddHours(1) で時刻が「飛ぶ/重複」面倒な計算は TimeZoneInfo.ConvertTime を使う
文化依存パース“07/08/2025" → 月日が逆?ParseExact で固定フォーマットに
DateTime.Now を単体保存サーバ移行でタイムゾーンがずれるUTC で持つ or DateTimeOffset を使用

まず覚える 5 ステップ

  1. 取得 ― DateTime.Now / UtcNow
  2. 分解 ― Year, Month, Day, Hour …
  3. 足し引き ― AddDays, AddHours, Subtract
  4. 書式化 ― ToString(“yyyy-MM-dd")
  5. 厳密変換 ― ParseExact / DateTimeOffset も検討

これだけで 締切日の計算・ログ出力・ユーザー入力検証 など、日付を扱う典型的な課題を安全にこなせます。慣れてきたら TimeZoneInfo や DateOnly / TimeOnly(.NET 6+)にも触れ、用途に応じた最適な型を選べるようになりましょう。

訪問数 6 回, 今日の訪問数 6回

C#,構造体

Posted by hidepon