簡體   English   中英

在 C# 中表示 Time 對象的最佳實踐是什么?

[英]What's best practice to represent a Time object in C#?

我在數據庫表中有一個時間列。 日期並不重要,我們只想要一天中的某個時間。 什么類型最適合在 C# 中表示它? 我打算使用 DateTime,但我不喜歡約會的想法。

雖然其他答案大多是正確的, TimeSpan是唯一可行的內置類型,但重要的是要意識到“經過時間的測量”和“時間”之間存在明顯的差異。

  • 最明顯的區別是一天中的時間必須少於24小時。 TimeSpan對象可以涵蓋更多內容。

  • 另一個區別是TimeSpan類型可能是負數 這表示時間倒退。 作為一個時間,負值將毫無意義。

  • 最后,一個時間包括任何可能適用於拍攝時區的夏令時概念。 所以你不能把它想象成“從午夜起經過的時間”。

    • 如果是春季DST過渡的那一天(在美國),則4:00的值僅從午夜開始經過3小時。
    • 如果它是DST過渡后期(在美國)的那一天,那么從午夜開始的5小時實際上已經過了4:00的值。
    • 由於世界各地的夏令時不同,完全有可能午夜甚至不存在,或存在兩次。 這種情況發生在巴西等地。

因此,如果您使用TimeSpan作為時間,則需要了解這些問題。 .NET沒有針對某個時間段的內置類型,因此這是一個可接受的折衷方案 ,即使它違反了它自己的設計。

即便是.NET Framework本身也會做出這種妥協。 例如:

  • DateTime類具有返回TimeSpanTimeOfDay屬性。
  • 如果您在SQL Server中有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表示從午夜到時間的時間跨度。

我會使用TimeSpan來表示這一點,TimeSpan是從午夜開始的時間跨度。 這與框架中DateTime的TimeOfDay屬性相關。

我們實際上推出了自己的Time類。 我們遇到的問題是TimeSpan不知道我們仍然需要的時區偏移。 所以我們創建了一個TimeSpanOffset類。 類似於DateTimeOffset類。 如果時區不重要,我肯定會堅持使用TimeSpan。

鑒於此問題是我剛剛進行的 Google 搜索中的最高結果,可能值得一提的是,在 .NET 6 即將發布(目前定於 2021 年 11 月 9 日)之后,該問題的正確答案可能是新的TimeOnly結構

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM