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

C# DateTime 進階使用技巧與常見陷阱總結

     編輯:關於C語言

一、取得某月天數


int days = DateTime.DaysInMonth(2024, 2); // 返回 29 (閏年)

二、計算兩個 DateTime 的差值


DateTime dt1 = DateTime.Now;
DateTime dt2 = dt1.AddDays(-5);

TimeSpan span = dt1 - dt2;

// 可取得屬性
span.Days;        // 5
span.Hours;       // 0
span.Minutes;     // 0
span.Seconds;     // 0
span.TotalHours;  // 120.0 (總小時數,含小數)
span.TotalMinutes; // 7200.0

// 支援負數 (dt1 早於 dt2 時)

三、DateTime 格式化輸出:12/24 小時制陷阱

常見錯誤:混淆 HH (24小時) 與 hh (12小時)

格式字串說明範例輸出 (14:30:05)
yyyy-MM-dd HH:mm:ss24 小時制 (正確)2024-01-15 14:30:05
yyyy-MM-dd hh:mm:ss12 小時制 (無 AM/PM 會誤導)2024-01-15 02:30:05
yyyy-MM-dd hh:mm:ss tt12 小時制 + AM/PM2024-01-15 02:30:05 PM

DateTimePicker 控制項設定


dateTimePicker1.Format = DateTimePickerFormat.Custom;
dateTimePicker1.CustomFormat = "yyyy-MM-dd HH:mm:ss"; // 大寫 HH = 24小時

四、檢查兩個時間區間是否重疊


// 區間 A: [AStart, AEnd]
// 區間 B: [BStart, BEnd]

bool IsOverlap(DateTime aStart, DateTime aEnd, DateTime bStart, DateTime bEnd)
{
    // 情況 1: B 開始於 A 內部
    // 情況 2: A 開始於 B 內部
    return (bStart <= aEnd) && (bEnd >= aStart);
}

// 等價邏輯 (原文件寫法)
if (bStart.CompareTo(aStart) <= 0 && bEnd.CompareTo(aStart) >= 0
 || bStart.CompareTo(aStart) >= 0 && bStart.CompareTo(aEnd) <= 0)
{
    // 重疊
}

五、實務進階技巧

1. 時區處理


// UTC 轉本地時間
DateTime utc = DateTime.UtcNow;
DateTime local = utc.ToLocalTime();

// 指定時區 (需 .NET 6+ / TimeZoneInfo)
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Taipei Standard Time");
DateTime taipeiTime = TimeZoneInfo.ConvertTimeFromUtc(utc, tzi);

2. 日期運算


DateTime dt = DateTime.Now;
dt.AddDays(7);      // 一週後
dt.AddMonths(1);    // 一個月後 (自動處理月份天數差異)
dt.AddYears(-1);    // 一年前

3. 解析字串


// 嚴格解析 (格式不符拋出例外)
DateTime dt = DateTime.ParseExact("2024-01-15 14:30:05", "yyyy-MM-dd HH:mm:ss", null);

// 寬鬆解析 (嘗試多種格式)
DateTime dt2 = DateTime.Parse("2024/01/15");

4. 避免常見 Bug

  • 幂等性:DateTime.Now 每次呼叫值不同,需存入變數重用
  • 不可變性:所有 Add* 方法回傳新實例,原物件不變
  • Kind 屬性:DateTimeKind.Utc/Local/Unspecified 影響轉換行為
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved