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