[英]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", ...
我想用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
更好。 在这里看一个例子。 然后,您可以使用工厂方法为您提供十年的范围: 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
。
如果您要求的是解决当前的问题,那么下面的代码就可以了,嘿,我很无聊,但我会考虑对DateTime范围进行一些研究,比较(特别是如何使用不同的TimeZones等工作和间隔。
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.