【问题标题】:Best class to represent a time代表时间的最佳班级
【发布时间】:2012-02-24 00:49:02
【问题描述】:

我正在处理时间表应用程序,我有一门课: 称为ClassOption 表示上课的可能时间。 带有字段(/属性):DayStartTimeEndTimeWeeks

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

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

但是我应该为StartTimeEndTime 使用什么调用。 它们是时间,但没有任何日期信息。 DateTime 似乎是一个合理的选择,但他们可以在任何日期。 (/许多日期) 按照业务逻辑,他们都准时,但这并不重要

【问题讨论】:

  • 日期处理的内置类型仅适用于简单的工作 IMO。由于您的要求更复杂,您可能需要查看第三方库,例如“Noda Time”。我相信乔恩很快就会发布一个推广 Noda 的答案:P 编辑:“很快”我的意思是,“已经这样做了”

标签: c# .net datetime time f#


【解决方案1】:

如果您乐于使用尚未达到 v1 的第三方库,我想插入 Noda Time。您将使用 LocalTime 结构。

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

哦,如果您确实使用 Noda Time,如果您有任何功能请求或 cmets,请告诉我们...

【讨论】:

  • 就像我看到有人发帖一样。我想:“嘿,Jon Skeet 不是在做时间图书馆吗?”。瞧,它就在这里。
  • Duration 结构有点奇怪 IMO。 TimeSpan 似乎完全多余。而且我也没有得到您的可变长度字段参数。一秒钟永远是一秒钟。该论点仅适用于较长的周期类型,例如月和年。 (日子有点灰色地带)。出于某种原因,它也只支持 FromXYZ 函数中的整数值。
  • @CodeInChaos:是的,Duration 实际上等同于 TimeSpan,但允许我们将所有内容都保留在“Noda”之内——支持一致的 API(希望如此)。是的,一些 句点字段具有固定长度,而其他则没有。仅支持 FromXYZ 函数的整数值对我来说似乎是合理的 - 我只想在 真的 我知道较小单位中的数量时指定小数值,作为整数。
【解决方案2】:

我会使用 DateTime,它只能在忽略日期的情况下与时间值一起使用,或者与 TimeSpan 一起使用,它可以表示自午夜以来经过的时间,因此是一天中的时间。事实上,这正是它在 DateTime 对象中的使用方式,当您请求 TimeOfDay 时,您会得到一个 TimeSpan。

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

【讨论】:

  • 如果您在当地时间工作,则添加和减去时间可能会导致 DateTime 出现问题。 DST 是邪恶的。
【解决方案3】:

您可以使用Time Period Library for .NETDateDiff 类来表示一个时间段:

// ----------------------------------------------------------------------
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 2013-06-05
    • 1970-01-01
    • 2018-11-29
    • 1970-01-01
    相关资源
    最近更新 更多