今日不可轉載,可在兒童節當天或之後在公衆号申請白名單。
千呼萬喚始出來
在
.NET 6(preview 4)
中引入了兩個期待已久的類型,将作為核心庫的一部分。
DateOnly
和
TimeOnly
允許開發人員表示
DateTime
的日期或時間部分。這兩個類型為值類型(struct type),可以在代碼中獨立處理日期或時間概念時使用,它們定義在System命名控件中,使用它們可以與資料庫中允許表示相同類型資料的方式保持一緻。具體來說,這些類型與SQL Server資料庫中日期和時間類型可以很好的進行比對。
注意:如果你要使用這兩種類型,需要下載下傳并安裝
.NET 6(preview 4)
Visual Studio 16.11
(目前處于預覽版中)。如果你想測試一下如何使用,可以使用
LinqPad
進行測試驗證。
.NET 6
中使用 DatetOnly
類型
.NET 6
DatetOnly
根據字面意思可以很容易看出它所要表達的意思。當我們需要表示一個沒有時間資訊的日期類型時,可以使用
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
在.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 end
LinqPad
中的最後一行的輸出内容。
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
值得考慮。
你喜歡這篇文章嗎?覺得它有用嗎?如果有,請考慮支援我,關注一下我的公衆号
作者:芝麻麻雀
出處:https://www.cnblogs.com/sesametech-netcore/
本文版權歸作者和部落格園共有,歡迎轉載,但必須給出原文連結,并保留此段聲明,否則保留追究法律責任的權利。