日付と時刻を 1 本で扱う値型 ― DateTime / System.DateTime 構造体
C# の DateTime は「日時」を 1 つの 64 bit 値(Ticks: 100 ns 単位)で表す 値型(struct) です。
- イミュータブルなので、加算・減算メソッドは必ず “新しい DateTime” を返します。
 - 「いつの時刻か」を示す Kind(Unspecified / Local / Utc)フィールドを内部に持ちます。
 
目次
よく使う “生成・取得” メンバ
| プロパティ / メソッド | 型 | 役割 | 例 | 
|---|---|---|---|
| Now | DateTime | ローカル時刻(PC のタイムゾーン) | var now = DateTime.Now; | 
| UtcNow | DateTime | 協定世界時 | var utc = DateTime.UtcNow; | 
| Today | DateTime | 0:00:00 付き今日の日付 | var today = DateTime.Today; | 
| Date(int y, int m, int d) | ctor | 指定日 0:00 作成 | new DateTime(2025, 7, 22); | 
| Parse( string ) / TryParse | DateTime / bool | 文字列→日時 | DateTime.Parse(“2025-07-22") | 
| FromFileTimeUtc(long) | DateTime | Windows FileTime→日時 | ― | 
失敗しうる変換は TryParse を推奨(bool ok = DateTime.TryParse(…))。
代表的なプロパティ
| プロパティ | 型 | 内容 | 例 (2025-07-22 08:15:30) | 
|---|---|---|---|
| Year / Month / Day | int | 年・月・日 | 2025 / 7 / 22 | 
| Hour / Minute / Second | int | 時・分・秒 | 8 / 15 / 30 | 
| DayOfWeek | DayOfWeek | 曜日 enum | DayOfWeek.Tuesday | 
| DayOfYear | int | 1‒366 日目 | 203 | 
| Ticks | long | 0001/1/1 0:00:00 からの 100 ns 数 | ― | 
| Kind | DateTimeKind | 時刻の基準 | 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
| 項目 | DateTime | DateTimeOffset | 
|---|---|---|
| Kind フラグ | Local / Utc / Unspecified | 代わりに タイムゾーン差 (±hh:mm) を保持 | 
| 演算 | Kind が異なると注意(暗黙変換なし) | どの地域でも “同じ瞬間” を保証 | 
| 推奨場面 | ローカル日付のみ(誕生日など)レガシー API と互換 | ログ時刻・DB など地理横断のタイムスタンプ | 
よくある落とし穴と対策
| シーン | つまずき | ヒント | 
|---|---|---|
| 夏時間 (DST) | AddHours(1) で時刻が「飛ぶ/重複」 | 面倒な計算は TimeZoneInfo.ConvertTime を使う | 
| 文化依存パース | “07/08/2025" → 月日が逆? | ParseExact で固定フォーマットに | 
| DateTime.Now を単体保存 | サーバ移行でタイムゾーンがずれる | UTC で持つ or DateTimeOffset を使用 | 
まず覚える 5 ステップ
- 取得 ― DateTime.Now / UtcNow
 - 分解 ― Year, Month, Day, Hour …
 - 足し引き ― AddDays, AddHours, Subtract
 - 書式化 ― ToString(“yyyy-MM-dd")
 - 厳密変換 ― ParseExact / DateTimeOffset も検討
 
これだけで 締切日の計算・ログ出力・ユーザー入力検証 など、日付を扱う典型的な課題を安全にこなせます。慣れてきたら TimeZoneInfo や DateOnly / TimeOnly(.NET 6+)にも触れ、用途に応じた最適な型を選べるようになりましょう。
訪問数 50 回, 今日の訪問数 2回







ディスカッション
コメント一覧
まだ、コメントがありません