在 .NET 6 中使用 DATEONLY 和 TIMEONLY
在 .NET 6 中使用 DATEONLY 和 TIMEONLY
在 即將發布的.NET 6中,引入了兩種期待已久的類型作為核心庫的一部分。DateOnly和TimeOnly允許開發人員表示 DateTime 的日期或時間部分。這兩種新類型是結構體(值類型),可以在您的代碼獨立處理日期或時間概念時使用。這兩種類型都可以在 System 命名空間中找到。使用這些新類型可能與數據庫允許表示類似數據的方式很好地保持一致。具體來說,這些類型與 SQL Server 日期和時間數據類型非常吻合。
注意:要訪問這些類型,您需要下載并安裝 .NET 6 預覽版 4[1](或更新版本)和Visual Studio 16.11(當前處于預覽版)[2]。
在 .NET 6 中使用 DATEONLY
這些類型對于它們所代表的內容幾乎是不言自明的。當我們需要表示沒有時間組件的日期時,我們可以使用 DateOnly。例如,也許我們在應用程序中代表某人的出生日期。在這種情況下,我們很少需要使用 DateTime 的時間部分,標準的解決方案是將時間設置為 00:00:00.000。使用 DateOnly,我們可以更明確地說明我們的意圖。
我們可以在 DateOnly 上構造一個實例,將年、月和日作為參數傳遞:
var date = new DateOnly(2020, 04, 20);這將創建一個表示 2020 年 4 月 20 日的 DateOnly。在內部,DateOnly 結構使用一個整數來跟蹤有效范圍為 0(映射到 0001 年 1 月 1 日到 3,652,058,映射到 9999 年 12 月 31 日)的日數。
通常,您將開始使用現有的 DateTime 并希望從中創建一個 DateOnly 實例。為此,我們可以調用 FromDateTime 方法:
var currentDate = DateOnly.FromDateTime(DateTime.Now);與現有的 DateTime 類型一樣,我們也可以使用 Parse 將表示日期的字符串解析為其 DateOnly 表示,這可能會引發異常或 TryParse,它返回一個指示成功或失敗的布爾值。
if (DateOnly.TryParse("28/09/1984", new CultureInfo("en-GB"), DateTimeStyles.None, out var result)) {Console.WriteLine(result); }上面的代碼嘗試從第一個參數(日期的字符串表示)解析日期。由于不同的國家和地區對日期的解釋不同,因此日期的解析可能會受到文化的影響。在此示例中,我明確提供了 en-GB 區域性以確保它使用日/月/年格式從字符串中正確解析。
如果 DateOnly 已成功解析,則將其寫入控制臺。再次; 文化在這里扮演著重要的角色。在此示例中,正在運行的線程的當前區域性用于確定所使用的格式。根據我的系統配置,我的應用程序線程恰好在 en-GB 下運行,因此格式化的字符串顯示為:
28/09/1984要了解有關解析和格式化的更多信息,您可以查看我最新的 Pluralsight 課程,C# 中的字符串操作:最佳實踐[3]。
我們還可以向 DateOnly 實例添加天數、月數或年數,從而產生具有調整日期的新實例。
var newDate = date.AddDays(1).AddMonths(1).AddYears(1);在 .NET 6 中使用 TIMEONLY
TimeOnly 結構體用于表示與日期無關的時間。例如,想象一下創建一個鬧鐘應用程序,讓用戶創建一個重復發生的鬧鐘。在這種情況下,我們想要存儲鬧鐘應該響起的時間,但日期無關緊要。
TimeOnly 類型有幾個構造函數重載。我希望大多數開發人員使用的更常見的允許我們創建一個日期,接受時間的小時和分鐘,小時,分鐘和秒,或小時,分鐘,秒和毫秒。
public TimeOnly(int hour, int minute) public TimeOnly(int hour, int minute, int second) public TimeOnly(int hour, int minute, int second, int millisecond)例如,要表示上午 10:30,我們可以創建以下 TimeOnly 實例。
var startTime = new TimeOnly(10, 30);小時部分預計將使用 24 小時時鐘格式提供,其中 1pm 是 13 小時。
在內部,TimeOnly 存儲一個 long,它表示從午夜到定義的時間已經過去的滴答數(100 納秒間隔)。例如,凌晨 1 點是一天中的 1 小時,因此自午夜 (00:00:00.0000000) 起有 36,000,000,000 個滴答聲。盡管我們也可以通過提供刻度作為參數來構造 TimeOnly,但此實現細節對于一般用途而言并非必不可少。
public TimeOnly(long ticks);在上面定義了開始時間后,讓我們使用另一個 TimeOnly 實例定義下午 5 點的結束時間。
var endTime = new TimeOnly(17, 00, 00);我們現在可以對這些 TimeOnly 實例執行數學運算,例如計算差異。
var diff = endTime - startTime;此操作的返回類型是 TimeSpan,然后我們可以使用它來寫入兩次之間的小時數。
Console.WriteLine($"Hours: {diff.TotalHours}");// Output = Hours: 6.5我們可以執行的另一個檢查是確定特定的 TimeOnly 是否在時間窗口內。例如,假設我們要檢查當前時間是否在我們已經定義的開始時間和結束時間之間。與 DateOnly 一樣,我們可以使用 FromDateTime 靜態方法將現有 DateTime 轉換為 TimeOnly。
var currentTime = TimeOnly.FromDateTime(DateTime.Now);var isBetween = currentTime.IsBetween(startTime, endTime);Console.WriteLine($"Current time {(isBetween ? "is" : "is not")} between start and end");上面的代碼現在將寫入控制臺當前時間是否介于 10:30(上午 10:30)和 17:00(下午 5 點)之間。
IsBetween 方法接受正常范圍(例如我們在前面的示例中使用的范圍)以及跨越午夜的范圍(例如 22:00-02:00)。
var startTime = new TimeOnly(22, 00);var endTime = new TimeOnly(02, 00);var now = new TimeOnly(23, 25); var isBetween = now.IsBetween(startTime, endTime);Console.WriteLine($"Current time {(isBetween ? "is" : "is not")} between start and end"); // Output = Current time is between start and endTimeOnly 還包括使用循環時鐘比較時間的運算符。
var startTime = new TimeOnly(08, 00);var endTime = new TimeOnly(09, 00); Console.WriteLine($"{startTime < endTime}");// Output = True此代碼檢查上午 8 點是否早于上午 9 點,這顯然是!
概括
我們對這兩種新類型的早期研究到此結束,這兩種類型已經在 .NET 6 預覽版 4 中出現。我覺得值得強調這些類型的存在,因為當我們習慣于默認為 DateTime/DateTimeOffset 時,這些更改很容易錯過在過去。如果您的數據需要獨立表示日期或時間,那么 DateOnly 和 TimeOnly 值得考慮用于面向 .NET 6 的新應用程序。
References
[1]?安裝 .NET 6 預覽版 4:?https://dotnet.microsoft.com/download/dotnet/6.0?WT.mc_id=DT-MVP-5002866
[2]?Visual Studio 16.11(當前處于預覽版):?https://visualstudio.microsoft.com/vs/preview/?WT.mc_id=DT-MVP-5002866
[3]?C# 中的字符串操作:最佳實踐:?https://www.stevejgordon.co.uk/pluralsight.pxf.io/EaEV1P
總結
以上是生活随笔為你收集整理的在 .NET 6 中使用 DATEONLY 和 TIMEONLY的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET 6 中的隐式命名空间引用
- 下一篇: asp.net ajax控件工具集 Au