[英]What's best practice to represent a Time object in C#?
我在數據庫表中有一個時間列。 日期並不重要,我們只想要一天中的某個時間。 什么類型最適合在 C# 中表示它? 我打算使用 DateTime,但我不喜歡約會的想法。
雖然其他答案大多是正確的, TimeSpan
是唯一可行的內置類型,但重要的是要意識到“經過時間的測量”和“時間”之間存在明顯的差異。
最明顯的區別是一天中的時間必須少於24小時。 TimeSpan
對象可以涵蓋更多內容。
另一個區別是TimeSpan
類型可能是負數 。 這表示時間倒退。 作為一個時間,負值將毫無意義。
最后,一個時間包括任何可能適用於拍攝時區的夏令時概念。 所以你不能把它想象成“從午夜起經過的時間”。
4:00
的值僅從午夜開始經過3小時。 4:00
的值。 因此,如果您使用TimeSpan
作為時間,則需要了解這些問題。 .NET沒有針對某個時間段的內置類型,因此這是一個可接受的折衷方案 ,即使它違反了它自己的設計。
即便是.NET Framework本身也會做出這種妥協。 例如:
DateTime
類具有返回TimeSpan
的TimeOfDay
屬性。 time
類型,則在通過.NET SQL客戶端返回時它將是TimeSpan
。 MSDN參考文檔有關於TimeSpan
類型的說法:
TimeSpan結構也可用於表示一天中的時間,但僅限於時間與特定日期無關。 否則,應使用DateTime或DateTimeOffset結構。
這基本上是另一種表達我在上面關於DST的第三點所述內容的方式。
但是,如果您不想在設計中做出妥協並希望獲得真正的時間類型,那么請查看Noda Time庫。
LocalTime
類型,表示一天中的某個時間。 這是對所提問題的直接回答。 Duration
類型,表示經過的時間度量。 Period
類型,表示日歷上的位置移動 - 這是TimeSpan
無法做到的其他事情。 例如,“3年零5個月”將是“ Period
值。 Offset
類型,類似於Duration
,但用作時區的UTC偏移量。 它的范圍僅限於此目的。 雖然有人可以說TimeSpan
更具通用性,因為它可以處理所有這些,但事實是它會讓你陷入麻煩。 通過分離類型,您可以獲得安全性和一致性。
或者,您可以將Microsoft提供的System.Time
包作為CoreFX Lab的一部分。 此程序包包含名為Time
的僅限Time
類型的實現,以及名為Date
的僅Date
類型。 您需要使用dotnet-corefxlab
MyGet源導入此包。
您可以使用TimeSpan結構來表示.NET中的時間。
Jon Skeet一直致力於Noda Time的工作 ,也許這會有所幫助。
Skeet關於為什么它可能適合你的帖子: DateTime的錯誤是什么?
你可以嘗試這樣的事情
TimeSpan ts = DateTime.Now.TimeOfDay
在哪里應用DateTime對象的time屬性並使用它。
使用Timespan表示從午夜到時間的時間跨度。
我們實際上推出了自己的Time類。 我們遇到的問題是TimeSpan不知道我們仍然需要的時區偏移。 所以我們創建了一個TimeSpanOffset類。 類似於DateTimeOffset類。 如果時區不重要,我肯定會堅持使用TimeSpan。
鑒於此問題是我剛剛進行的 Google 搜索中的最高結果,可能值得一提的是,在 .NET 6 即將發布(目前定於 2021 年 11 月 9 日)之后,該問題的正確答案可能是新的TimeOnly
結構。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.