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

Car*_*rlo 17 c# datetime

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

Mat*_*int 27

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

  • 最明显的区别是一天中的时间必须少于24小时.一个TimeSpan对象可以覆盖更多.

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

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

    • 如果它是春季DST过渡的那一天(在美国),那么一个值4:00仅从午夜起经过了3个小时.
    • 如果是退回DST过渡的那一天(在美国),那么4:00实际上从午夜起已经过了5个小时的值.
    • 而且,由于DST是不同世界各地,这是完全可能的,半夜根本不存在,或存在两次.这种情况发生在巴西等地.

因此,如果您将其TimeSpan用作时间,则需要了解这些问题..NET没有一个内置式的时间的天,所以这是一个可以接受的妥协,即使它违反了它自己的设计.

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

  • DateTime类有一个TimeOfDay返回的属性TimeSpan.
  • 如果您time在SQL Server中有类型,那么它将是TimeSpan通过.NET SQL客户端返回的.

MSDN参考文档有这样说的TimeSpan类型:

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

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

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

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

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

或者,您可以将System.TimeMicrosoft提供的软件包视为CoreFX Lab的一部分.此包包含一个名为time-only的类型的实现Time,以及一个名为date-only的类型Date.您需要使用dotnet-corefxlabMyGet Feed导入此包.

  • @Guffa - 问题是"在C#中哪种类型最适合代表它(一天中的某个时间)?" - 答案是Noda Time库中的`LocalTime`类型.其余的是理由. (4认同)
  • @Guffa - 显然我们同意不同意.我支持我的立场,我尊重你的立场.美好的一天. (2认同)

dom*_*mer 16

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

  • 但是TimeSpan不是一段时间吗?显然,结束时间未知,事件可能只在下午2点开始并且无限期地结束.使用TimeSpan仍然是个好主意吗? (4认同)
  • @dimmer - 不完全是。看我的回答。 (2认同)

cod*_*ife 5

乔恩·斯基特(Jon Skeet)一直在研究Noda Time,这可能会有所帮助。

Skeet上关于为什么它适合您的帖子:无论如何,DateTime有什么问题?