我正在制作覆盖"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;
}
(假设
start
和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
。