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

C# DateTime 比較、差值計算與加減運算完整實用指南

     編輯:關於C語言

DateTime 比較大小


string s1 = "12:13", s2 = "14:14";
DateTime dt1 = DateTime.Parse(s1);           // 今日日期 + 指定時間
DateTime dt2 = DateTime.Parse(s2);
DateTime now = DateTime.Now;

// 靜態方法 Compare:回傳 -1/0/1
int cmp = DateTime.Compare(dt1, dt2);        // -1 表示 dt1 < dt2

// 實例方法
bool earlier = dt1 < dt2;                    // 運算子多載
bool earlier2 = dt1.CompareTo(dt2) < 0;      // 介面方法

// 輸出
Console.WriteLine($"{dt1:HH:mm} {(cmp < 0 ? "<" : ">")} {dt2:HH:mm}");

計算兩時間差值 — TimeSpan


public static string GetTimeDiffString(DateTime dt1, DateTime dt2) {
    TimeSpan diff = (dt1 > dt2) ? dt1 - dt2 : dt2 - dt1; // 取絕對值
    // 或 diff = dt1.Subtract(dt2).Duration();

    return $"{diff.Days}天 {diff.Hours}時 {diff.Minutes}分 {diff.Seconds}秒";
}

// 使用
DateTime start = new DateTime(2024, 1, 1, 10, 0, 0);
DateTime end   = new DateTime(2024, 1, 3, 14, 30, 15);
Console.WriteLine(GetTimeDiffString(start, end)); // 2天 4時 30分 15秒

TimeSpan 完整屬性

屬性說明範例值
Days完整天數2
Hours小時部分 (0-23)4
Minutes分鐘部分 (0-59)30
Seconds秒部分 (0-59)15
Milliseconds毫秒部分 (0-999)0
Ticks總 100ns 刻度1890150000000
TotalDays總天數 (double)2.18767
TotalHours總小時數52.5041
TotalMinutes總分鐘數3150.25
TotalSeconds總秒數189015
TotalMilliseconds總毫秒數189015000

日期加減運算


// 1. 加減 TimeSpan
DateTime now = DateTime.Now;
DateTime tomorrow = now.AddDays(1);
DateTime lastWeek = now.AddDays(-7);
DateTime in2Hours = now.AddHours(2);
DateTime halfHourAgo = now.AddMinutes(-30);

// 2. 使用 TimeSpan 物件
TimeSpan offset = new TimeSpan(40, 0, 0, 0); // 40天
DateTime dt2 = now.Subtract(offset);         // 40天前
DateTime dt3 = now + offset;                 // 40天後(運算子多載)

// 3. 加減月份/年份(處理月份天數差異)
DateTime nextMonth = now.AddMonths(1);       // 同一天數,超過則取該月最後一天
DateTime nextYear = now.AddYears(1);

格式化輸出


DateTime dt = new DateTime(2024, 12, 31, 23, 59, 59);

Console.WriteLine(dt.ToString("yyyy-MM-dd HH:mm:ss"));     // 2024-12-31 23:59:59
Console.WriteLine(dt.ToString("yyyy/MM/dd"));              // 2024/12/31
Console.WriteLine(dt.ToString("yyyy年MM月dd日 HH時mm分"));  // 2024年12月31日 23時59分
Console.WriteLine(dt.ToString("o"));                       // ISO 8601: 2024-12-31T23:59:59.0000000
Console.WriteLine(dt.ToString("r"));                       // RFC 1123: Tue, 31 Dec 2024 23:59:59 GMT

解析字串為 DateTime


string s = "2024-12-31 23:59:59";

// 1. Parse / ParseExact (失敗拋例外)
DateTime dt1 = DateTime.Parse(s);                           // 依 CurrentCulture
DateTime dt2 = DateTime.ParseExact(s, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);

// 2. TryParse / TryParseExact (失敗回傳 false,不拋例外) —— 推薦
if (DateTime.TryParseExact(s, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime dt3)) {
    Console.WriteLine("解析成功");
}

// 3. 多格式嘗試
string[] formats = { "yyyy-MM-dd", "yyyy/MM/dd", "yyyy年MM月dd日" };
DateTime.TryParseExact(input, formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out _);

時區與 DateTimeOffset

DateTime.Kind 三種:`Unspecified`(預設)、`Utc`、`Local`。跨時區運算易出錯,**強烈建議使用 `DateTimeOffset`**:


// 含時區偏移的時間點
DateTimeOffset dto = DateTimeOffset.Now;           // 本地時間 + 偏移
DateTimeOffset dtoUtc = DateTimeOffset.UtcNow;     // UTC

// 轉換
DateTimeOffset toTokyo = dto.ToOffset(TimeSpan.FromHours(9));
DateTime utcTime = dto.UtcDateTime;

// 資料庫儲存建議:統一存 UTC (DateTime) 或 DateTimeOffset
// 顯示時再轉使用者時區

常見陷阱

  • DateTime.Now 精度約 10-15ms,高精度計時請用 `Stopwatch`。
  • 減法 `dt1 - dt2` 回傳 `TimeSpan`,若 `dt1 < dt2` 結果為負值,用 `.Duration()` 取絕對值。
  • `AddMonths` 遇 1/31 + 1月 → 2/28(非閏年),非直觀,業務邏輯需確認。
  • 序列化:`DateTime` 預設不含時區資訊,跨時區傳輸請用 `DateTimeOffset` 或統一 UTC。
  • 資料庫 `DATETIME` vs `DATETIMEOFFSET` / `TIMESTAMP WITH TIME ZONE` 選型要一致。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved