.NET 6中使用DateOnly和TimeOnly類型
在.NET 6(preview 4)中引入了兩個期待已久的類型,將作為核心庫的一部分。DateOnly和TimeOnly允許開發(fā)人員表示DateTime的日期或時間部分。這兩個類型為值類型(struct type),可以在代碼中獨(dú)立處理日期或時間概念時使用,它們定義在System命名控件中,使用它們可以與數(shù)據(jù)庫中允許表示相同類型數(shù)據(jù)的方式保持一致。具體來說,這些類型與SQL Server數(shù)據(jù)庫中日期和時間類型可以很好的進(jìn)行匹配。
注意:如果你要使用這兩種類型,需要下載并安裝.NET 6(preview 4)和Visual Studio 16.11(目前處于預(yù)覽版中)。如果你想測試一下如何使用,可以使用LinqPad進(jìn)行測試驗(yàn)證。
在.NET 6中使用DatetOnly類型
根據(jù)字面意思可以很容易看出它所要表達(dá)的意思。當(dāng)我們需要表示一個沒有時間信息的日期類型時,可以使用DateOnly。例如,我們可以在應(yīng)用程序中表示某人的出生日期。在這種情況下,我們很少需要使用到DateTime類型的時間部分了。一個標(biāo)準(zhǔn)的解決方案時將時間設(shè)置為:00:00:00.000。但是使用DateOnly,我們可以更明確的表明我們想要的意圖。
我們可以通過年、月、日參數(shù)構(gòu)建一個DateOnly的實(shí)例。
var date = new DateOnly(2021, 5, 31);
這樣,我們就創(chuàng)建了一個表示2021年5月31日的日期類型。在內(nèi)部,DataOnly結(jié)構(gòu)使用一個整數(shù)來跟蹤一個有效天數(shù)的時間范圍:0(映射為0001年1月1日)-3652058(映射為9999年12月31日)。
通常情況下,我們會從一個現(xiàn)有的DateTime類型的實(shí)例開始,希望從它創(chuàng)建一個DateOnly實(shí)例。為了實(shí)現(xiàn)這一點(diǎn),我們可以調(diào)用FromDateTime方法。
var currentDateOnly = DateOnly.FromDateTime(DateTime.Now);
與現(xiàn)有的DateTime類型一樣,我們也可以使用Parse或TryParse方法將表示日期的字符串解析為DateOnly類型,這兩個方法可能會拋出異常,或返回指示成功或失敗的bool值。
if (DateOnly.TryParse("28/09/1984", new CultureInfo("en-GB"), DateTimeStyles.None, out var result))
{
?? ?Console.WriteLine($"{result.Year}-{result.Month}-{result.Day}");
}上面的代碼嘗試從第一個參數(shù)(日期的字符串表示)解析日期。由于不同的國家和地區(qū)對日期的解釋不同,因此日期的解析可能或受到文化的影響。在這個例子中,明確提供CultureInfo選項(xiàng),以確保它使用日/月/年的格式從字符串中正確解析。
在成功解析成DateOnly實(shí)例的情況下,它將被寫入控制臺。再一次強(qiáng)調(diào):CultureInfo選擇在這里扮演著重要角色。在本例中,將使用正在運(yùn)行的線程的當(dāng)前區(qū)域性來確定所使用的格式。根據(jù)系統(tǒng)配置,在應(yīng)用程序線程在en-GB下運(yùn)行。因此字符串被正確格式化。
在LinqPad輸出結(jié)果:

我們還可以向DateOnly實(shí)例中調(diào)用AddDays、AddMonths和AddYears方法,以創(chuàng)建一個新的日期類型的實(shí)例。
var newDateOnly = date.AddDays(1).AddMonths(1).AddYears(1);
在.NET 6中使用TimeOnly類型
TimeOnly結(jié)構(gòu)體用于表示一個與日期無關(guān)的一個時間類型。例如,想象創(chuàng)建一個鬧鐘應(yīng)用程序,讓用戶創(chuàng)建一個重復(fù)出現(xiàn)的鬧鐘。在這種情況下,我們要存儲一天中報(bào)警應(yīng)該想起的時間,但這個時間和日期是沒有關(guān)系的。TimeOnly類型有幾個構(gòu)造方法重載。我認(rèn)為大多數(shù)開發(fā)者會使用的且更常見的方法是允許我們創(chuàng)建一個可以小時分鐘,小時分鐘秒數(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);
在這里,小時采用24小時制格式,這樣 1 PM 就是13時。
在內(nèi)部,TimeOnly存儲了一個long類型,它表示自定義時間從凌晨后經(jīng)過的Ticks(100納秒一個tick)。例如,凌晨1點(diǎn)時一天中的第一個小時,因此,從凌晨開始就有360億個Tick(00:00:00.0000000)。雖然我們可以通過提供Ticks作為參數(shù)來構(gòu)造TimeOnly。但這個實(shí)現(xiàn)細(xì)節(jié)對于一般使用來說并不是必需的。
public TimeOnly(long ticks);
在定義了開始時間之后,我們可以使用另一個TimeOnly實(shí)例定義一個結(jié)束時間為5PM。
var endTime = new TimeOnly(17, 00, 00);
現(xiàn)在就可以對這些TimeOnly實(shí)例進(jìn)行數(shù)學(xué)操作,比如計(jì)算差。
var diff = endTime - startTime;
該操作返回類型是TimeSpan,記錄了兩個TimeOnly值之間相差的小時數(shù)??梢钥?code>LinqPad的輸出結(jié)果。

我們可以執(zhí)行的另一個檢查時識別特定的TimeOnly是否在時間窗口內(nèi)。例如,假設(shè)我們想要檢查當(dāng)前時間是否在我們定義的開始時間和結(jié)束時間之間。與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");上面的代碼將輸出到控制臺,以確定當(dāng)前時間是否在10:30(10:30 AM)和17:00(5 PM)之間。LinqPad輸出的結(jié)果進(jìn)行了稍微的改變,用來輸出當(dāng)前時間。

方法IsBetween()可以接受兩個參數(shù),正常的時間范圍,如我們前面的示例中使用的范圍。同樣可以接受跨凌晨的時間范圍,如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 endLinqPad中的最后一行的輸出內(nèi)容。

TimeOnly還包括用于比較使用循環(huá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),顯然是早于9點(diǎn)的。
總結(jié):
面向.NET 6 的新應(yīng)用程序中,如果您的數(shù)據(jù)需要獨(dú)立表示日期或時間,那么 DateOnly 和 TimeOnly 值得考慮。
到此這篇關(guān)于.NET 6中使用DateOnly和TimeOnly類型的文章就介紹到這了,更多相關(guān).NET 6中使用DateOnly和TimeOnly內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ASP.NET Core MVC 依賴注入View與Controller
本文重點(diǎn)給大家介紹的是ASP.NET Core MVC 之依賴注入 View 和ASP.NET Core MVC 之依賴注入 Controller的相關(guān)資料,需要的小伙伴可以參考下面文章具體內(nèi)容2021-09-09
ASP.NET通過Web.config實(shí)現(xiàn)驗(yàn)證賬號密碼是否正確進(jìn)行登錄
本文是通過authentication(認(rèn)證訪問者) 和 authorization( 訪問權(quán)限),來實(shí)現(xiàn)一個簡單的判斷用戶賬號密碼是否正確,需要的朋友可以參考下2021-09-09
ASP.NET?Core使用功能開關(guān)控制路由訪問操作
這篇文章主要介紹了ASP.NET?Core使用功能開關(guān)控制路由訪問操作,而對于一些試驗(yàn)性的功能,我們并不希望用密碼去控制是否允許訪問,而是想用一種開關(guān)的方式開放,下面文章我們就來試著實(shí)現(xiàn)這個功能,需要的小伙伴可以參考一下2022-02-02
ASP.NET?Core?6最小API中使用日志和DI示例詳解
這篇文章主要為大家介紹了ASP.NET?Core?6最小API中使用日志和DI示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
ASP.NET Web API教程 創(chuàng)建Admin視圖詳細(xì)介紹
現(xiàn)在我們轉(zhuǎn)入客戶端,并添加一個能夠使用從Admin控制器而來的數(shù)據(jù)的頁面。通過給控制器發(fā)送AJAX請求的方式,該頁面將允許用戶創(chuàng)建、編輯,或刪除產(chǎn)品2012-11-11

