日付と時刻を 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+)にも触れ、用途に応じた最適な型を選べるようになりましょう。
訪問数 6 回, 今日の訪問数 6回
ディスカッション
コメント一覧
まだ、コメントがありません