c# – 这是用TimeSpan代表几十年的最佳方式吗?

我正在制作一张涵盖“1930-1940”,“1940-1950”,“1950-1960”,“1960-1970”的图表,……

我想用DateTime和Timespan表示这个,但我不确定如何制作TimeSpan,我发现很难验证我的时间跨度是否正确.

这是我应该如何使用TimeSpan,还是重叠?如果它重叠,那么我该如何解决呢?

List<DateTime> list1 = new List<DateTime>();
List<TimeSpan> list2 = new List<TimeSpan>();

int startYearInt = 1930;

int times = 0;
const int intervalSize = 10;
for (int i = startYearInt; i < 2020; i += intervalSize)
{
    DateTime sYear = new DateTime(startYearInt + (intervalSize * times++),1,1);
    TimeSpan period = (sYear.AddYears(intervalSize)) - sYear;

    list1.Add(sYear);
    list2.Add(period); // <<-- Don't kNow if if this is correct?
}

编辑:
我也有这个.如果我的时间跨度太小或持续时间可能会产生一些问题.

public bool IsInsidePeriod(DateTime dt)
{
    return dt >= FromYearDateTime && dt < FromYearDateTime.Add(periodTimeSpan);
}

解决方法

创建Daterange值类型比使用DateTime和TimeSpan更好.以 here为例.然后,您可以使用工厂方法为您提供十年的范围:Daterange.DecadeStartingOn(1930);.这样,您就可以提高抽象级别并处理代码本身所引用的概念.

您的IsInsidePeriod是Daterange的简单操作:

public bool Includes(DateTime date) {
  return start <= date && date <= end;
}

(假设开始和结束都包括在内)

现在,如果你只需要处理数十年,那么你真的不需要一个完整的Daterange类,就这样:

class Decade {

  public int StartYear { get; private set; }
  public int EndYear { get { return StartYear + 9; } }

  public Decade(int startYear) {
    StartYear = startYear;
  }

  public bool Includes(DateTime date) {
    return StartYear <= date.Year && date.Year <= EndYear;
  }

  public override string ToString() {
    return string.Format("{0}-{1}",StartYear,EndYear + 1);
  }

}

或者更普遍的YearRange.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...