在.NET 6中使用DateOnly和TimeOnly
千呼萬喚始出來
在.NET 6(preview 4)中引入了兩個期待已久的類型,將作為核心庫的一部分。DateOnly和TimeOnly允許開發人員表示DateTime的日期或時間部分。這兩個類型為值類型(struct type),可以在代碼中獨立處理日期或時間概念時使用,它們定義在System命名控件中,使用它們可以與數據庫中允許表示相同類型數據的方式保持一致。具體來說,這些類型與SQL Server數據庫中日期和時間類型可以很好的進行匹配。
注意:如果你要使用這兩種類型,需要下載并安裝.NET 6(preview 4)和Visual Studio 16.11(目前處于預覽版中)。如果你想測試一下如何使用,可以使用LinqPad進行測試驗證。
在.NET 6中使用DateOnly類型
根據字面意思可以很容易看出它所要表達的意思。當我們需要表示一個沒有時間信息的日期類型時,可以使用DateOnly。例如,我們可以在應用程序中表示某人的出生日期。在這種情況下,我們很少需要使用到DateTime類型的時間部分了。一個標準的解決方案時將時間設置為:00:00:00.000。但是使用DateOnly,我們可以更明確的表明我們想要的意圖。
我們可以通過年、月、日參數構建一個DateOnly的實例。
var?date?=?new?DateOnly(2021,?5,?31);這樣,我們就創建了一個表示2021年5月31日的日期類型。在內部,DataOnly結構使用一個整數來跟蹤一個有效天數的時間范圍:0(映射為0001年1月1日)-3652058(映射為9999年12月31日)。
通常情況下,我們會從一個現有的DateTime類型的實例開始,希望從它創建一個DateOnly實例。為了實現這一點,我們可以調用FromDateTime方法。
var?currentDateOnly?=?DateOnly.FromDateTime(DateTime.Now);與現有的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}"); }上面的代碼嘗試從第一個參數(日期的字符串表示)解析日期。由于不同的國家和地區對日期的解釋不同,因此日期的解析可能或受到文化的影響。在這個例子中,明確提供CultureInfo選項,以確保它使用日/月/年的格式從字符串中正確解析。在成功解析成DateOnly實例的情況下,它將被寫入控制臺。再一次強調:CultureInfo選擇在這里扮演著重要角色。在本例中,將使用正在運行的線程的當前區域性來確定所使用的格式。根據系統配置,在應用程序線程在en-GB下運行。因此字符串被正確格式化。在LinqPad輸出結果:
我們還可以向DateOnly實例中調用AddDays、AddMonths和AddYears方法,以創建一個新的日期類型的實例。
var?newDateOnly?=?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小時制格式,這樣 1 PM 就是13時。
在內部,TimeOnly存儲了一個long類型,它表示自定義時間從凌晨后經過的Ticks(100納秒一個tick)。例如,凌晨1點時一天中的第一個小時,因此,從凌晨開始就有360億個Tick(00:00:00.0000000)。雖然我們可以通過提供Ticks作為參數來構造TimeOnly。但這個實現細節對于一般使用來說并不是必需的。
public?TimeOnly(long?ticks);在定義了開始時間之后,我們可以使用另一個TimeOnly實例定義一個結束時間為5PM。
var?endTime?=?new?TimeOnly(17,?00,?00);現在就可以對這些TimeOnly實例進行數學操作,比如計算差。
var?diff?=?endTime?-?startTime;該操作返回類型是TimeSpan,記錄了兩個TimeOnly值之間相差的小時數。可以看LinqPad的輸出結果。
我們可以執行的另一個檢查時識別特定的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 AM)和17:00(5 PM)之間。LinqPad輸出的結果進行了稍微的改變,用來輸出當前時間。
方法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?endLinqPad中的最后一行的輸出內容。
TimeOnly還包括用于比較使用循環時鐘的時間操作符。
var?startTime?=?new?TimeOnly(08,?00); var?endTime?=?new?TimeOnly(09,?00);Console.WriteLine($"{startTime?<?endTime}"); //?Output?=?True這段代碼檢查上午8點是否早于上午9點,顯然是早于9點的。
總結
面向 .NET 6 的新應用程序中,如果您的數據需要獨立表示日期或時間,那么 DateOnly 和 TimeOnly 值得考慮。
你喜歡這篇文章嗎?覺得它有用嗎?如果有,請考慮支持我
廣告時間:如果你身邊有正在做化妝品的朋友,可以給他們推薦一下。或者自己的女朋友正在為美麗而煩惱,請推薦給你的女朋友!
— END —
「擴展閱讀」
Xamarin.Forms: 無限滾動的ListView(懶加載方式)
[GitHub] 75+的 C# 數據結構和算法實現
誰說.NET不適合搞BD,ML、AI
推薦一個集錄屏、截圖、音頻于一體的軟件給大家
10個用于C#.NET開發的基本調試工具
Xamarin.Forms 二維碼掃描實踐
在Asp.Net Core MVC 開發過程中遇到的問題總結
前端小白在asp.net core mvc中使用ECharts
基于Asp.Net Core MVC和AdminLTE的響應式管理后臺之側邊欄處理
[譯]如何在C#中調試LINQ查詢
C# 語言性能提升方法
使用MQTTnet搭建Mqtt服務器
OxyPlot在WinForm中的應用
「公眾號推薦」
回復:「rdm」?獲取Redis Desktop Manager版的安裝包
回復:「redis」?獲取5.0.9版的Windows安裝包(exe)
回復:「ca」 獲取 ?截圖、GIF等工具三件套,便攜版和安裝版全部包括
「加號主回復”入群“」即可加入群聊
總結
以上是生活随笔為你收集整理的在.NET 6中使用DateOnly和TimeOnly的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: out参数不用赋值?这么神奇吗!
- 下一篇: 通过Dapr实现一个简单的基于.net的