なんかいろいろと書いてくブログ

関東のどこかで働く、一般人

【C#】System.DateOnly と System.TimeOnlyについて

.NET 6 から新しく、System.DateOnly と System.TimeOnlyという構造体が追加された これらは DateTime の日付部分または時刻部分のみをもつ構造体とのことで

時間の差分を見るようなときに使いそうな気がするので調べてみた

公式ドキュメント

System.DateOnly

https://docs.microsoft.com/ja-jp/dotnet/api/system.dateonly

System.TimeOnly

https://docs.microsoft.com/ja-jp/dotnet/api/system.timeonly

DateTime、DateTimeOffsetとの比較

string date = "2022/01/01 22:22:32";

DateTime DateTimeStruct = DateTime.Parse(date); // 2022/01/01 22:22:32

DateTimeOffset DateTimeOffsetStruct = DateTimeOffset.Parse(date); // 22:22:32 +09:00

// "2022/01/01 22:22:32"での形式はParceに失敗する
//DateOnly DateonlyStruct = DateOnly.Parse(date);
DateOnly DateonlyStruct = DateOnly.Parse("2022/01/01"); // 2022/01/01

//DateOnly DateonlyStruct = DateOnly.Parse(date);
TimeOnly TimeOnlyStruct = TimeOnly.Parse("22:22:32"); // 22:22

確かに、なまえの通り年月日または時間のみが格納されている しかし、'"2022/01/01 22:22:32"' のような文字列をDateOnlyやTimeOnlyにParseしようとすると Formatのエラーで怒られる

また、DateTimeやDateTimeOffsetからの変換するメソッド見当たらなく、 (これは私が見落としているだけかもしれない)

実際にこれらの構造体を使用する際には 実装を少し考えなければならなさそうだ

また、DateOnlyとTimeOnlyともに差分計算のメソッドが実装されており 特にTimeOnlyに関しては 年月日を意識せずに時間の計算ができる