2012-03-12 45 views
6

我正在覆蓋"1930-1940", "1940-1950", "1950-1960", "1960-1970", ...這是用TimeSpan代表數十年的最佳方式嗎?

我想用一個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); 
} 
+0

你爲什麼不只是代表他們作爲整數? – 2012-03-12 16:04:43

+0

爲什麼日期時間_and_時間跨度?你需要的是N + 1 DateTime值。 – 2012-03-12 16:07:30

+4

一個'TimeSpan'是簡單的量時間,沒有附加到任何時間點(10年的跨度就是這樣 - 可能是10的跨度一個世紀前或千年後)。 – Oded 2012-03-12 16:08:09

回答

7

你最好創建一個DateRange值類型比使用DateTimeTimeSpan這樣。以here爲例。然後你可以有一個工廠方法,給你一個十年的範圍:。通過這種方式,您可以提高抽象級別,並在代碼本身中處理您所指的的概念。

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

+0

十年是一個10年的時期,你的十年代碼不起作用:-) – Lloyd 2012-03-12 17:25:42

+1

@Lloyd十年的最後一年是開始一年後的九年。 10年後將是另一個十年的開始 – RichK 2012-03-12 17:33:20

0

您可以簡化您的IsInPeriod方法是這樣的:

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

正如其他人所說,TimeSpan是不買你任何東西,並且你的過於複雜的問題描述。特別注意比較運算符。你可能希望任何一方都是排他性的而不是包容性的,反之亦然。

1

如果你要解決的問題是解決當前的問題,那麼下面的代碼工作,嘿,我很無聊,但我會考慮做一些日期範圍的研究,比較(尤其是如何與不同的時區等工作和間隔。

DateTime on MSDN

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)); 
    } 
} 
相關問題