繁体   English   中英

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

[英]Is this the best way to represent decades with TimeSpan?

我正在制作一张涵盖"1930-1940", "1940-1950", "1950-1960", "1960-1970", ...的图表"1930-1940", "1940-1950", "1950-1960", "1960-1970", ...

我想用DateTimeTimespan表示这个,但我不确定如何制作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值类型比使用DateTimeTimeSpan更好。 在这里看一个例子。 然后,您可以使用工厂方法为您提供十年的范围: DateRange.DecadeStartingOn(1930); 这样,您就可以提高抽象级别并处理代码本身所引用的概念。

IsInsidePeriod是一个简单的操作的DateRange

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

(假设startend包括在内

现在,如果你只需要处理数十年 ,那么你真的不需要一个完整的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

如果您要求的是解决当前的问题,那么下面的代码就可以了,嘿,我很无聊,但我会考虑对DateTime范围进行一些研究,比较(特别是如何使用不同的TimeZones等工作和间隔。

MSDN上的DateTime

class Program
{   
    static void Main(string[] args)
    {
        int interval = 10;
        DateTime isInRangeDate = DateTime.UtcNow;

        for (int i = 1930; i < 2020; )
        {
            DateRange range = new DateRange(1, 1, i, interval);
            Console.WriteLine(string.Format("{0}: Is in range - {1}", range.ToString(), range.IsInsidePeriod(isInRangeDate)));


            i = range.EndDate.Year;
        }               

        Console.ReadLine();
    }  
}


public class DateRange
{
    public DateTime StartDate { get; private set; }
    public DateTime EndDate { get; private set; }

    public override string ToString()
    {
        return string.Format("{0}-{1}", this.StartDate.Year, this.EndDate.Year);
    }

    public DateRange(int day, int month, int year, int addYears)
    {
        StartDate = new DateTime(year, month, day, 0, 0, 0);
        EndDate = StartDate.AddYears(addYears);
    }

    public bool IsInsidePeriod(DateTime dt)
    {
        return ((dt.Date >= StartDate) && (dt.Date < EndDate));
    }
}

您可以将IsInPeriod方法简化为以下内容:

public bool IsInsidePeriod(DateTime dateToCompare, DateTime startDate, DateTime endDate)
{
    return startDate <= dateToCompare && dateToCompare < endDate;
}

正如其他人所提到的, TimeSpan并没有给你买任何东西,并且使你描述的问题过于复杂。 特别注意比较运算符。 您可能希望任何一端都是独占而不是包容,反之亦然。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM