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

前端之家收集整理的这篇文章主要介绍了c# – 这是用TimeSpan代表几十年的最佳方式吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在制作一张涵盖“1930-1940”,“1940-1950”,“1950-1960”,“1960-1970”的图表,……

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

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

  1. List<DateTime> list1 = new List<DateTime>();
  2. List<TimeSpan> list2 = new List<TimeSpan>();
  3.  
  4. int startYearInt = 1930;
  5.  
  6. int times = 0;
  7. const int intervalSize = 10;
  8. for (int i = startYearInt; i < 2020; i += intervalSize)
  9. {
  10. DateTime sYear = new DateTime(startYearInt + (intervalSize * times++),1,1);
  11. TimeSpan period = (sYear.AddYears(intervalSize)) - sYear;
  12.  
  13. list1.Add(sYear);
  14. list2.Add(period); // <<-- Don't know if if this is correct?
  15. }

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

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

解决方法

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

您的IsInsidePeriod是DateRange的简单操作:

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

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

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

  1. class Decade {
  2.  
  3. public int StartYear { get; private set; }
  4. public int EndYear { get { return StartYear + 9; } }
  5.  
  6. public Decade(int startYear) {
  7. StartYear = startYear;
  8. }
  9.  
  10. public bool Includes(DateTime date) {
  11. return StartYear <= date.Year && date.Year <= EndYear;
  12. }
  13.  
  14. public override string ToString() {
  15. return string.Format("{0}-{1}",StartYear,EndYear + 1);
  16. }
  17.  
  18. }

或者更普遍的YearRange.

猜你在找的C#相关文章