在C#中表示Time对象的最佳做法是什么?

时间:2010-09-10 23:18:33

标签: c# datetime

我在数据库表中有一个Time列。日期并不重要,我们只想要一天的时间。哪种类型最适合用C#表示?我打算使用DateTime,但我不喜欢约会的想法。

7 个答案:

答案 0 :(得分:26)

虽然其他答案大多是正确的,TimeSpan是唯一可行的内置类型,但重要的是要意识到“经过时间的测量”和“时间的测量”之间存在明显差异。天”。

  • 最明显的区别是一天中的时间必须少于24小时。 TimeSpan对象可以涵盖更多内容。

  • 另一个区别是TimeSpan类型可能否定。这表示时间倒退。作为一个时间,负值将毫无意义。

  • 最后,一个时间段包括可能适用于拍摄时区的任何夏令时概念。所以你不能把它想象成“从午夜起经过的时间”。

    • 如果是春季DST过渡的那一天(在美国),则4:00的值仅从午夜起经过了3个小时。
    • 如果是DST过渡期(在美国),那么4:00的值实际上已经过了5个小时,从午夜开始。
    • 由于世界各地的夏令时不同,完全有可能午夜甚至不存在,或存在两次。这种情况发生在巴西等地。

因此,如果您使用TimeSpan作为时间,则需要了解这些问题。 .NET没有针对某个时间段的内置类型,因此这是可接受的折衷,即使它违反了它自己的设计。

即使是.NET Framework本身也会做出这种妥协。例如:

  • DateTime类的TimeOfDay属性返回TimeSpan
  • 如果您在SQL Server中输入time,则在通过.NET SQL客户端返回时,它将是TimeSpan

MSDN Reference DocumentationTimeSpan类型:

有这个说法
  

TimeSpan结构也可用于表示一天中的时间,但仅限于时间与特定日期无关。否则,应改为使用DateTime或DateTimeOffset结构。

这基本上是另一种说明我在上面关于DST的第三点所述内容的方式。

但是,如果您不想在设计中做出妥协并希望获得真实的时间类型,那么请查看Noda Time库。

  • LocalTime类型,表示一天中的某个时间。 这是对所提问题的直接回答。
  • Duration类型,表示已用时间的度量。
  • 还有Period类型,表示日历上的位置移动 - 这是TimeSpan无法做到的其他事情。例如,“3年零5个月”将是Period值。
  • 还有Offset类型,类似于Duration,但用作时区的UTC偏移量。它的范围仅限于此目的。

虽然有些人可以说TimeSpan因为可以处理所有这些而更加通用,但事实是它可以让你陷入困境。通过分离类型,您可以获得安全性和一致性。

或者,您可以将Microsoft提供的System.Time程序包视为CoreFX Lab的一部分。此包包含名为Time的仅限时间类型的实现,以及名为Date的仅限日期的类型。您需要使用dotnet-corefxlab MyGet Feed导入此包。

答案 1 :(得分:15)

您可以使用TimeSpan结构来表示.NET中的时间。

答案 2 :(得分:4)

Jon Skeet一直在做一些名为Noda Time的事情,也许这会有所帮助。

Skeet关于它为什么适合你的帖子:What's Wrong with DateTime Anyway?

答案 3 :(得分:2)

你可以试试这样的事情

TimeSpan ts = DateTime.Now.TimeOfDay

您正在应用DateTime对象的time属性并使用它。

答案 4 :(得分:1)

使用Timespan来表示从午夜到时间的时间跨度。

答案 5 :(得分:1)

我会使用TimeSpan来表示这一点,TimeSpan是午夜以来的时间跨度。这与框架中DateTime的TimeOfDay属性相关。

答案 6 :(得分:0)

我们实际上推出了自己的Time类。我们遇到的问题是TimeSpan不知道我们仍然需要的时区偏移。所以我们创建了一个TimeSpanOffset类。类似于DateTimeOffset类。如果时区不重要,我肯定会坚持使用TimeSpan。