Это лучший способ представлять десятилетия с TimeSpan? - PullRequest
6 голосов
/ 12 марта 2012

Я делаю график, который охватывает "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?
}

EDIT: У меня это тоже есть. И если Мой временной интервал слишком мал или может длиться долго, это может вызвать некоторые проблемы.

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

Ответы [ 3 ]

7 голосов
/ 12 марта 2012

Вам лучше создать тип значения 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.

1 голос
/ 12 марта 2012

Если все, что вы просите, - это решить текущие проблемы, то приведенный ниже код работает, эй, мне скучно, но я бы рассмотрел некоторые исследования диапазонов DateTime, сравнений (особенно работы с различными часовыми поясами и т. Д. И интервалами). .

DateTime на 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));
    }
}
0 голосов
/ 12 марта 2012

Вы можете упростить ваш метод IsInPeriod примерно так:

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

Как уже упоминали другие, TimeSpan ничего вам не покупает и усложняет описанную вами проблему. Обратите особое внимание на операторы сравнения. Вы можете хотеть, чтобы любой конец был исключительным, а не включающим, или наоборот.

...