C# 代表时间的最佳类

C# 代表时间的最佳类,c#,.net,datetime,time,f#,C#,.net,Datetime,Time,F#,我正在制作时间表应用程序,我有一门课: 调用ClassOption,表示可能的上课时间。 带有字段(/properties):天、开始时间、结束时间、和周 现在Day很简单,它的类型是DayOfWeek Weeks将要求我制作一个自定义类,因为它由大学自己的学期周表示法或日历周表示,但最终基本上会归结为一组整数 但是StartTime和EndTime应该使用什么调用呢。 它们是时间,但没有任何日期信息。 DateTime似乎是一个合理的选择,但它们可能在任何日期。(/许多日期) 根据业务逻辑,它

我正在制作时间表应用程序,我有一门课: 调用
ClassOption
,表示可能的上课时间。 带有字段(/properties):
开始时间
结束时间
、和

现在
Day
很简单,它的类型是
DayOfWeek

Weeks
将要求我制作一个自定义类,因为它由大学自己的学期周表示法或日历周表示,但最终基本上会归结为一组整数

但是
StartTime
EndTime
应该使用什么调用呢。 它们是时间,但没有任何日期信息。
DateTime
似乎是一个合理的选择,但它们可能在任何日期。(/许多日期)
根据业务逻辑,它们都是准时的,但这并不重要

如果您愿意使用尚未达到v1的第三方库,我想插上插头。你应该使用struct

如果坚持使用基类库,则可能需要使用
TimeSpan
,或者可以坚持使用
DateTime
。显然,我认为
LocalTime
将是一个更优雅的解决方案:)


哦,如果您确实使用野田佳彦时间,请告诉我们您是否有任何功能请求或评论…

我会使用DateTime,它只能用于忽略日期的时间值,或者使用TimeSpan,它可以表示从午夜开始经过的时间,因此是一天中的某个时间。事实上,这正是DateTime对象中使用它的方式,当您询问TimeOfDay时,您会得到一个TimeSpan


两者都很好,因为它们为您提供了一组方便的算术运算来比较、加和减时间。只需忽略日期部分。

您可以使用的DateDiff类来表示时间段:

// ----------------------------------------------------------------------
public void DateDiffSample()
{
  DateTime date1 = new DateTime( 2009, 11, 8, 7, 13, 59 );
  Console.WriteLine( "Date1: {0}", date1 );
  // > Date1: 08.11.2009 07:13:59
  DateTime date2 = new DateTime( 2011, 3, 20, 19, 55, 28 );
  Console.WriteLine( "Date2: {0}", date2 );
  // > Date2: 20.03.2011 19:55:28

  DateDiff dateDiff = new DateDiff( date1, date2 );

  // description
  Console.WriteLine( "DateDiff.GetDescription(1): {0}", dateDiff.GetDescription( 1 ) );
  // > DateDiff.GetDescription(1): 1 Year
  Console.WriteLine( "DateDiff.GetDescription(2): {0}", dateDiff.GetDescription( 2 ) );
  // > DateDiff.GetDescription(2): 1 Year 4 Months
  Console.WriteLine( "DateDiff.GetDescription(3): {0}", dateDiff.GetDescription( 3 ) );
  // > DateDiff.GetDescription(3): 1 Year 4 Months 12 Days
  Console.WriteLine( "DateDiff.GetDescription(4): {0}", dateDiff.GetDescription( 4 ) );
  // > DateDiff.GetDescription(4): 1 Year 4 Months 12 Days 12 Hours
  Console.WriteLine( "DateDiff.GetDescription(5): {0}", dateDiff.GetDescription( 5 ) );
  // > DateDiff.GetDescription(5): 1 Year 4 Months 12 Days 12 Hours 41 Mins
  Console.WriteLine( "DateDiff.GetDescription(6): {0}", dateDiff.GetDescription( 6 ) );
  // > DateDiff.GetDescription(6): 1 Year 4 Months 12 Days 12 Hours 41 Mins 29 Secs
} // DateDiffSample

就在我看到有人发帖的时候。我想:“嘿,Jon Skeet不是在时间图书馆工作吗?”。瞧,它就在这里。
Duration
struct在我看来有点奇怪。它似乎与
TimeSpan
完全冗余。我也不明白你的变长字段参数。一秒钟总是一秒钟。该论点仅适用于较长的周期类型,如月和年。(日子有点灰暗)。出于某种原因,它还只支持它的
FromXYZ
函数中的整数值。@CodeInChaos:是的,持续时间实际上相当于时间跨度,但允许我们将所有内容保持在“Noda”范围内,支持一致的API(希望如此)。是的,一些周期字段有固定的长度,但其他字段没有。仅支持FromXYZ函数的整数值对我来说似乎是合理的-我只想在我真正知道以较小单位表示的数值时指定分数值,即整数。日期处理的内置类型仅适用于简单作业。因为您的要求更复杂,您可能希望查看第三方库,例如“Noda Time”。我相信Jon很快就会发布一个答案来推广Noda:P编辑:我说的“很快”是指“已经做了”的时间加和减,如果你在当地时间工作,可能会导致日期时间出现问题。DST是邪恶的。