我的数据库表中有一个“时间”列。日期不重要,我们只需要一天中的时间。在C#中,最好用哪种类型来表示它?我原本想用DateTime,但我不喜欢有日期这个概念。
我有一个在数据库表中的时间列,日期无关紧要,只需要记录一天中的时间。在C#中,代表这个时间的最佳数据类型是什么?我本打算使用DateTime,但我不想涉及日期的概念。从.NET 6开始,您可以使用内置的TimeOnly
数据类型。其背景与以下相同:
虽然其他答案大多是正确的,一个TimeSpan
是唯一可用的内置类型,但重要的是要意识到“经过的时间测量”和“一天中的时间”之间存在明显的差异。
TimeSpan
用作一天中的时间,则需要注意这些问题。 .NET没有内置类型用于表示一天中的时间,因此这是一种可以接受的妥协,即使它违反了自身的设计。DateTime
类有一个TimeOfDay
属性,返回一个TimeSpan
。
- 如果在SQL Server中使用time
类型,则通过.NET SQL Client返回时将会是一个TimeSpan
。
MSDN参考文档对TimeSpan
类型有以下说明:然而,如果您不想在设计中妥协,并且希望实时的时间类型,请看看Noda Time库。
LocalTime
类型表示一天中的时间。 这是问题的直接答案。Duration
类型表示经过的时间。Period
类型表示日历上的位置移动 - 这是TimeSpan
无法做到的。例如,“3年5个月”将是一个Period
值。Offset
类型类似于Duration
,但用作时区相对于UTC的偏移量。它的范围仅限于此目的。虽然有人可能会说TimeSpan
更加通用,因为它可以处理所有这些内容,但事实是它会让您陷入麻烦。通过分离类型,您可以获得安全性和一致性。
或者,您可以考虑使用微软的 CoreFX Lab 中可用的 更新:在 .NET 6+ 中内置了 System.Time
包。该包含有一个名为Time
的仅时间类型和一个名为Date
的仅日期类型的实现。您将需要使用dotnet-corefxlab
MyGet feed导入此包。TimeOnly
数据类型
您可以使用 TimeSpan 结构在 .NET 中表示时间。
TimeSpan ts = DateTime.Now.TimeOfDay
在您应用 DateTime 对象的 time 属性时,只需使用它即可。
time
类型,它代表一天中的时间,而不是经过的时间。我也在这个答案中提到了这一点。在现实生活中,这可能会在用户输入验证中出现问题。一个字符串可能可以解析为有效的TimeSpan
,但无法适应数据库中的time
列。如果用户输入24:00
作为一天中的时间,这将失败,除非您采取额外的步骤进行范围验证。 - Matt Johnson-Pint[0,24)
,但无论如何,我的答案中的重点在第三个要点。你不能仅仅说它是“自午夜以来经过的时间”,因为有些值并不是这样。MSDN参考文献稍微有所不同,我会更新我的答案以反映这一点。 - Matt Johnson-PintTimeSpan
允许你表示那些值为真的情况,这就是我想说的。 - Reed Copsey考虑到这个问题是我刚刚进行的谷歌搜索中的顶部结果,可能值得说一下,在.NET 6即将发布(目前计划于2021年11月9日发布)之后,正确答案可能是新的TimeOnly
结构体。