繁体   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