在 C# 中和日期時間相關的資料行別有很多,馬上來介紹
將字串轉換為 DateTime:
取得現在時間:
以台北時間(Asia/Taipei) UTC+08:00 來說可以使用 TimeSpan.FromHours 來指定:
上面兩個顯示出來好像沒有差異,都是設定什麼時間就顯示什麼時間,如果要轉換需使用 ToLocalTime() ,就會依照本地的時區轉換了:
取得現在時間使用 Now 或 UtcNow 都可以,只是顯示不同,但其實兩者都一樣,使用 ToLocalTime 就可以驗證:
參考資料:
Microsoft.Learn - DateTime Struct
Microsoft.Learn - DateOnly Struct
Microsoft.Learn - TimeOnly Struct
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
感謝教學~
回覆刪除