簡體   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