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

C# DateTime 與 TimeSpan 時間處理完整指南:建立、格式化、運算、時區與效能

     編輯:關於C語言

一、DateTime 核心建構與取得當前時間

方式程式碼說明
建構函式new DateTime(2004, 10, 19)年月日,時間為 00:00:00
含時間new DateTime(2004, 10, 19, 22, 47, 35)時分秒
含毫秒new DateTime(2004, 10, 19, 22, 47, 35, 259)毫秒
當前本地時間DateTime.Now含時區資訊 Kind=Local
當前 UTC 時間DateTime.UtcNowKind=Utc,高效能、無時區轉換
當前日期DateTime.Today時間歸零

二、格式化輸出:標準與自訂格式字串


DateTime now = DateTime.Now;

// 標準格式
Console.WriteLine(now.ToString("d")); // 短日期
Console.WriteLine(now.ToString("D")); // 長日期
Console.WriteLine(now.ToString("t")); // 短時間
Console.WriteLine(now.ToString("T")); // 長時間
Console.WriteLine(now.ToString("f")); // 完整日期時間(短時間)
Console.WriteLine(now.ToString("F")); // 完整日期時間(長時間)
Console.WriteLine(now.ToString("g")); // 一般(短日期+短時間)
Console.WriteLine(now.ToString("G")); // 一般(短日期+長時間)
Console.WriteLine(now.ToString("u")); // 通用可排序 yyyy-MM-dd HH:mm:ssZ
Console.WriteLine(now.ToString("o")); // 往返格式 yyyy-MM-ddTHH:mm:ss.fffffffK

// 自訂格式
string custom = now.ToString("yyyy-MM-dd HH:mm:ss.fff");
Console.WriteLine(custom); // 2024-01-15 14:30:45.123

DateTime格式化輸出

三、TimeSpan:時間間隔運算

建立 TimeSpan


// 從時間單位建構
TimeSpan ts1 = new TimeSpan(4, 12, 0, 0); // 4天12小時
TimeSpan ts2 = new TimeSpan(2, 12, 0, 0); // 2天12小時
TimeSpan total = ts1 + ts2; // 7天

// 從 DateTime 相減得到
DateTime start = DateTime.Now;
DateTime end = start.AddHours(2.5);
TimeSpan diff = end - start; // 2.5小時

常用屬性

屬性說明範例 (7.5天)
Days整天數7
Hours剩餘小時 (0-23)12
Minutes剩餘分鐘 (0-59)0
Seconds剩餘秒數 (0-59)0
Milliseconds剩餘毫秒 (0-999)0
TotalDays總天數 (double)7.5
TotalHours總小時數180
TotalMinutes總分鐘數10800
TotalSeconds總秒數648000
TotalMilliseconds總毫秒數648000000

格式化輸出


TimeSpan ts = new TimeSpan(7, 12, 30, 15, 500);
Console.WriteLine(ts.ToString());        // 7.12:30:15.5000000
Console.WriteLine(ts.ToString(@"dd\.hh\:mm\:ss")); // 07.12:30:15

TimeSpan運算結果

四、DateTime 日期時間運算:不可變模式

所有運算方法回傳新實例,原物件不變:

方法範例說明
AddYearsdt.AddYears(10)加減年
AddMonthsdt.AddMonths(-3)加減月(自動處理月末)
AddDaysdt.AddDays(7)加減天
AddHoursdt.AddHours(12)加減時
AddMinutesdt.AddMinutes(30)加減分
AddSecondsdt.AddSeconds(45)加減秒
AddMillisecondsdt.AddMilliseconds(500)加減毫秒
Adddt.Add(TimeSpan.FromDays(1))加減 TimeSpan
Subtractdt.Subtract(otherDt)相減得 TimeSpan

DateTime加減運算結果

五、時區與 Kind 屬性:避開常見陷阱

Kind含義行為
Unspecified無時區資訊不進行任何轉換,序列化保持原樣
UtcUTC 時間轉本地時自動加時差,ToString 顯示 Z
Local本地時間轉 UTC 自動減時差,跨時區序列化需注意

關鍵轉換方法


DateTime local = DateTime.Now;
DateTime utc = local.ToUniversalTime(); // Local → Utc
DateTime local2 = utc.ToLocalTime();    // Utc → Local

DateTime unspecified = new DateTime(2024, 1, 1, 12, 0, 0); // Kind=Unspecified
DateTime asUtc = DateTime.SpecifyKind(unspecified, DateTimeKind.Utc);
DateTime asLocal = DateTime.SpecifyKind(unspecified, DateTimeKind.Local);

TimeZoneInfo 進階時區轉換


TimeZoneInfo taipei = TimeZoneInfo.FindSystemTimeZoneById("Taipei Standard Time");
DateTime utc = DateTime.UtcNow;
DateTime taipeiTime = TimeZoneInfo.ConvertTimeFromUtc(utc, taipei);

六、高效能與最佳實務

  1. 大量運算用 DateTime.UtcNow:避免本地時區查詢開銷
  2. 資料庫儲存統一用 UTC:應用層轉換顯示
  3. 避免在迴圈中重複呼叫 DateTime.Now:快取當前時間
  4. 序列化指定 DateTimeKind.Utc:防止反序列化時區錯位
  5. NodaTime 套件:企業級專案建議引入,提供 Instant、ZonedDateTime、LocalDateTime 等更嚴謹型別

總結

DateTime 代表時間點,TimeSpan 代表時間間隔,兩者結合支援完整的日期時間運算。核心原則:不可變運算、明確時區、統一 UTC 儲存、自訂格式化輸出。掌握 Kind、TimeZoneInfo、標準/自訂格式字串,即能處理 99% 的業務時間需求。

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