首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET Framework 日期時間類型深度解析:DateTime、DateTimeOffset 與 TimeZoneInfo

     編輯:關於.NET

日期時間處理是開發高頻需求,.NET 從 1.0 的 DateTime、2.0 的 Nullable<DateTime>、3.5 的 DateTimeOffset 到 TimeZoneInfo,逐步解決時區、可空性與跨時區識別問題。本文系統整理各類型特性、轉換規則與選用指南。

DateTime 與 DateTimeOffset 核心差異

  • DateTime:僅含日期時間值,Kind 屬性標示 Unspecified/Utc/Local,不攜帶時差資訊,跨時區易產生歧義。
  • DateTimeOffset:包含 DateTime 值與 Offset(相對 UTC 時差),唯一識別一個時間點,不依賴特定時區,適合跨時區應用。
Console.WriteLine(DateTime.Now);       // 2008/8/26 23:01:48
Console.WriteLine(DateTimeOffset.Now); // 2008/8/26 23:01:48 +08:00

手動建構與 Kind 指定

DateTime dateA = new DateTime(2008,8,26,23,1,48);
DateTimeOffset dateB = new DateTimeOffset(2008,8,26,23,1,48, new TimeSpan(4,0,0)); // UTC+4

DateTime ⇄ DateTimeOffset 相互轉換

關鍵在於 DateTime.Kind:

  • Utc:轉換後 Offset = +00:00
  • Local:轉換後 Offset = 本地時區時差
  • Unspecified:視同 Local 處理
DateTime dateB = DateTime.SpecifyKind(dateA, DateTimeKind.Utc);
DateTimeOffset dateC = dateB; // 隱含轉換,Offset = +00:00

DateTimeOffset → DateTime 三種屬性:

  • DateTime:Unspecified 幾何值
  • UtcDateTime:UTC 時間(自動換算)
  • LocalDateTime:本地時間(經 UTC 轉換)

選用指南:何時用 DateTimeOffset?

  • 應用需支援多時區、跨區域部署 → 優先用 DateTimeOffset(SQL Server 2008+ 亦支援)。
  • 僅處理日期(如生日)、單一時區內部系統 → DateTime 即可。
  • 若堅持用 DateTime,務必明確設定 Kind = DateTimeKind.Utc 並統一以 UTC 儲存/傳輸。

TimeZone 與 TimeZoneInfo

TimeZone 僅能識別本地時區;TimeZoneInfo 提供全球所有时區資料、轉換、列舉功能,完全取代前者:

TimeZoneInfo eastern = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTimeOffset easternDate = TimeZoneInfo.ConvertTime(chinaDate, eastern);

未來開發應棄用 TimeZone,全面採用 TimeZoneInfo。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved