我在数据库表中有一个Time列。日期并不重要,我们只想要一天的时间。哪种类型最适合用C#表示?我打算使用DateTime,但我不喜欢约会的想法。
答案 0 :(得分:26)
虽然其他答案大多是正确的,TimeSpan
是唯一可行的内置类型,但重要的是要意识到“经过时间的测量”和“时间的测量”之间存在明显差异。天”。
最明显的区别是一天中的时间必须少于24小时。 TimeSpan
对象可以涵盖更多内容。
另一个区别是TimeSpan
类型可能否定。这表示时间倒退。作为一个时间,负值将毫无意义。
最后,一个时间段包括可能适用于拍摄时区的任何夏令时概念。所以你不能把它想象成“从午夜起经过的时间”。
4:00
的值仅从午夜起经过了3个小时。4:00
的值实际上已经过了5个小时,从午夜开始。因此,如果您使用TimeSpan
作为时间,则需要了解这些问题。 .NET没有针对某个时间段的内置类型,因此这是可接受的折衷,即使它违反了它自己的设计。
即使是.NET Framework本身也会做出这种妥协。例如:
DateTime
类的TimeOfDay
属性返回TimeSpan
。time
,则在通过.NET SQL客户端返回时,它将是TimeSpan
。 MSDN Reference Documentation对TimeSpan
类型:
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)
答案 6 :(得分:0)
我们实际上推出了自己的Time类。我们遇到的问题是TimeSpan不知道我们仍然需要的时区偏移。所以我们创建了一个TimeSpanOffset类。类似于DateTimeOffset类。如果时区不重要,我肯定会坚持使用TimeSpan。