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}");
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秒
| 屬性 | 說明 | 範例值 |
|---|---|---|
| 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
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 _);
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`。