int days = DateTime.DaysInMonth(2024, 2); // 返回 29 (閏年)
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 時)
常見錯誤:混淆 HH (24小時) 與 hh (12小時)
| 格式字串 | 說明 | 範例輸出 (14:30:05) |
|---|---|---|
| yyyy-MM-dd HH:mm:ss | 24 小時制 (正確) | 2024-01-15 14:30:05 |
| yyyy-MM-dd hh:mm:ss | 12 小時制 (無 AM/PM 會誤導) | 2024-01-15 02:30:05 |
| yyyy-MM-dd hh:mm:ss tt | 12 小時制 + AM/PM | 2024-01-15 02:30:05 PM |
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)
{
// 重疊
}
// 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);
DateTime dt = DateTime.Now;
dt.AddDays(7); // 一週後
dt.AddMonths(1); // 一個月後 (自動處理月份天數差異)
dt.AddYears(-1); // 一年前
// 嚴格解析 (格式不符拋出例外)
DateTime dt = DateTime.ParseExact("2024-01-15 14:30:05", "yyyy-MM-dd HH:mm:ss", null);
// 寬鬆解析 (嘗試多種格式)
DateTime dt2 = DateTime.Parse("2024/01/15");
DateTime.Now 每次呼叫值不同,需存入變數重用Add* 方法回傳新實例,原物件不變DateTimeKind.Utc/Local/Unspecified 影響轉換行為