【发布时间】:2011-04-10 23:34:06
【问题描述】:
我在数据库表中有一个时间列。日期并不重要,我们只想要一天中的某个时间。什么类型最适合用 C# 来表示它?我打算使用 DateTime,但我不喜欢约会的想法。
【问题讨论】:
我在数据库表中有一个时间列。日期并不重要,我们只想要一天中的某个时间。什么类型最适合用 C# 来表示它?我打算使用 DateTime,但我不喜欢约会的想法。
【问题讨论】:
虽然其他答案大多是正确的,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 结构。
这基本上是我在上面第三点中提到的关于夏令时的另一种说法。
但是,如果您对在设计中做出妥协不感兴趣并且想要实时类型,那么请查看 Noda Time 库。
LocalTime 类型,它代表一天中的某个时间。 这是对所提问题的直接回答。
Duration 类型,它表示经过的时间度量。Period 类型,它表示日历上的位置移动——这是TimeSpan 无法做到的。例如,“3 年零 5 个月”将是 Period 值。Offset 类型,它类似于Duration,但用作时区的UTC 偏移量。它的范围仅限于该目的。虽然有些人可能会说TimeSpan 更通用,因为它可以处理所有这些,但事实是它会让你陷入困境。通过分离类型,您可以获得安全性和一致性。
或者,您可以考虑将 Microsoft 提供的 System.Time 包作为 CoreFX Lab 的一部分。此包包含名为Time 的仅时间类型和名为Date 的仅日期类型的实现。您将需要使用 dotnet-corefxlab MyGet 提要来导入此包。
【讨论】:
LocalTime 类型。剩下的就是理由。
您可以在 .NET 中使用 TimeSpan 结构来表示时间。
【讨论】:
Jon Skeet 一直在研究名为 Noda Time 的东西,也许这会有所帮助。
Skeet 关于为什么它可能适合您的帖子:What's Wrong with DateTime Anyway?
【讨论】:
你可以试试这样的
TimeSpan ts = DateTime.Now.TimeOfDay
您在哪里应用 DateTime 对象的时间属性并使用它。
【讨论】:
使用时间跨度来表示从午夜到时间的时间跨度。
【讨论】:
time type,它代表一天中的时间,而不是经过的时间。我也谈到了这一点in this answer。在现实生活中,这可能会在用户输入验证中对您造成影响。字符串可能可以解析为有效的TimeSpan,但不适合数据库中的time 列。如果用户输入 24:00 作为一天中的某个时间,除非您采取额外步骤进行范围验证,否则这将失败
【讨论】:
[0,24),但无论如何,重点是我回答的第三个项目符号。您不能只说这是“自午夜以来经过的时间”,因为有些值是不正确的。 MSDN 参考的说法略有不同,我将更新我的答案以反映这一点。
TimeSpan 确实允许你表示 是 为真的值,这就是我所说的。
我们实际上推出了自己的 Time 课程。我们遇到的问题是 TimeSpan 不知道我们仍然需要的时区偏移量。所以我们创建了一个 TimeSpanOffset 类。有点类似于 DateTimeOffset 类。如果时区不重要,我肯定会坚持使用 TimeSpan。
【讨论】:
鉴于这个问题是我刚刚在 Google 搜索中获得的最高结果,可能值得一提的是,在即将发布的 .NET 6(目前定于 2021 年 11 月 9 日)之后,该问题的正确答案可能是the new TimeOnly struct.
【讨论】: