C# 中的常用的 日期時間 資料型別

在 C# 中和日期時間相關的資料行別有很多,馬上來介紹

DateTime

DateTime 是最常使用到的格式,要使用很簡單:
    
// 2024-04-08 23:59:59
DateTime dateTime = new DateTime(2024, 4, 8, 23, 59, 59);
Console.WriteLine(dateTime.ToString("yyyy-MM-dd HH:mm:ss")); // 2024-04-08 23:59:59
    

將字串轉換為 DateTime:
    
string dateTimeString = "2024-04-08 23:59:59";
DateTime dateTime = DateTime.ParseExact(dateTimeString, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);
    

取得現在時間:
    
DateTime dateTime = DateTime.Now;
    

DateTimeOffset

DateTimeOffset 和 DateTime 的差別在於 DateTimeOffset 多了時區資訊:
    
DateTimeOffset dateTimeOffset = new DateTimeOffset(2024, 4, 8, 23, 59, 59, TimeSpan.Zero);
Console.WriteLine(dateTimeOffset.ToString("yyyy-MM-dd HH:mm:ss")); // 2024-04-08 23:59:59
    

以台北時間(Asia/Taipei) UTC+08:00 來說可以使用 TimeSpan.FromHours 來指定:
    
// UTC +8
DateTimeOffset dateTimeOffset = new DateTimeOffset(2024, 4, 8, 23, 59, 59, TimeSpan.FromHours(8));
Console.WriteLine(dateTimeOffset.ToString("yyyy-MM-dd HH:mm:ss")); // 2024-04-08 23:59:59
    

上面兩個顯示出來好像沒有差異,都是設定什麼時間就顯示什麼時間,如果要轉換需使用 ToLocalTime() ,就會依照本地的時區轉換了:
    
DateTimeOffset dateTimeOffset1 = new DateTimeOffset(2024, 4, 8, 23, 59, 59, TimeSpan.Zero);
Console.WriteLine(dateTimeOffset1.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss")); // 2024-04-09 07:59:59

DateTimeOffset dateTimeOffset2 = new DateTimeOffset(2024, 4, 8, 23, 59, 59, TimeSpan.FromHours(8));
Console.WriteLine(dateTimeOffset2.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss")); // 2024-04-08 23:59:59
    

取得現在時間使用 Now 或 UtcNow 都可以,只是顯示不同,但其實兩者都一樣,使用 ToLocalTime 就可以驗證:
    
DateTimeOffset dateTimeOffset3 = DateTimeOffset.Now;
DateTimeOffset dateTimeOffset4 = DateTimeOffset.UtcNow;

// toString: 2024-06-16 00:17:08, toLocalTime: 2024-06-16 00:17:08
Console.WriteLine($"toString: {dateTimeOffset3.ToString("yyyy-MM-dd HH:mm:ss")}, toLocalTime: {dateTimeOffset3.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss")}");
// toString: 2024-06-15 16:17:08, toLocalTime: 2024-06-16 00:17:08
Console.WriteLine($"toString: {dateTimeOffset4.ToString("yyyy-MM-dd HH:mm:ss")}, toLocalTime: {dateTimeOffset4.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss")}");
    

DateOnly (.NET 6 +)

如果只要儲存日期,不需要儲存時間就可以使用 DateOnly:
    
DateOnly dateOnly = new DateOnly(2024, 4, 8);
Console.WriteLine(dateOnly.ToString("yyyy-MM-dd")); // 2024-04-08

DateOnly dateOnly2 = DateOnly.FromDateTime(DateTime.Now);
Console.WriteLine(dateOnly2.ToString("yyyy-MM-dd")); // 2024-04-08
    

TimeOnly (.NET 6 +)

阿如果只要儲存時間資訊,不需要儲存日期,也是有 TimeOnly 格式可以使用:
    
TimeOnly timeOnly = new TimeOnly(23, 59, 59);
Console.WriteLine(timeOnly.ToString("HH:mm:ss")); // 23:59:59

TimeOnly timeOnly2 = TimeOnly.FromDateTime(DateTime.Now);
Console.WriteLine(timeOnly2.ToString("HH:mm:ss")); // 23:59:59
    



參考資料:
Microsoft.Learn - DateTime Struct
Microsoft.Learn - DateOnly Struct
Microsoft.Learn - TimeOnly Struct

留言

張貼留言

如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com