天天看點

在.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

中使用

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

輸出結果:

在.NET 6中使用DateOnly和TimeOnly

我們還可以向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

的輸出結果。

在.NET 6中使用DateOnly和TimeOnly

我們可以執行的另一個檢查時識别特定的

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輸出的結果進行了稍微的改變,用來輸出目前時間。

在.NET 6中使用DateOnly和TimeOnly

方法

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

中的最後一行的輸出内容。

在.NET 6中使用DateOnly和TimeOnly

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

值得考慮。

你喜歡這篇文章嗎?覺得它有用嗎?如果有,請考慮支援我,關注一下我的公衆号

在.NET 6中使用DateOnly和TimeOnly

作者:芝麻麻雀

出處:https://www.cnblogs.com/sesametech-netcore/

本文版權歸作者和部落格園共有,歡迎轉載,但必須給出原文連結,并保留此段聲明,否則保留追究法律責任的權利。

繼續閱讀