Каков наилучший способ получения относительного диапазона дат (на этой неделе, в этом году, в прошлом месяце и т. Д.) Из DateTime? - PullRequest
8 голосов
/ 02 апреля 2009

Я уверен, что я не первый, кому нужно это делать, поэтому я ищу лучший способ.

У меня есть набор переключателей с такими вариантами, как

  • В этом году
  • В прошлом году
  • в этом месяце
  • в прошлом месяце
  • На этой неделе
  • На прошлой неделе

и мне нужно создать соответствующий относительный диапазон дат от текущей даты (DateTime.Now).

Например, если было выбрано Last Year и текущая дата была 4/2/09 14:45:32, мне нужно было бы вернуть дату начала 1/1/08 00:00:00 и дату окончания 12/31/08 23:59:59.

Есть мысли?

Ответы [ 4 ]

24 голосов
/ 02 апреля 2009

Все они были протестированы с использованием DateTime.Today и работают так, как вы просили:

public struct DateRange
{
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
}

public static DateRange ThisYear(DateTime date)
{
    DateRange range = new DateRange();

    range.Start = new DateTime(date.Year, 1, 1);
    range.End = range.Start.AddYears(1).AddSeconds(-1);

    return range;
}

public static DateRange LastYear(DateTime date)
{
    DateRange range = new DateRange();

    range.Start = new DateTime(date.Year - 1, 1, 1);
    range.End = range.Start.AddYears(1).AddSeconds(-1);

    return range;
}

public static DateRange ThisMonth(DateTime date)
{
    DateRange range = new DateRange();

    range.Start = new DateTime(date.Year, date.Month, 1);
    range.End = range.Start.AddMonths(1).AddSeconds(-1);

    return range;
}

public static DateRange LastMonth(DateTime date)
{
    DateRange range = new DateRange();

    range.Start = (new DateTime(date.Year, date.Month, 1)).AddMonths(-1);
    range.End = range.Start.AddMonths(1).AddSeconds(-1);

    return range;
}

public static DateRange ThisWeek(DateTime date)
{
    DateRange range = new DateRange();

    range.Start = date.Date.AddDays(-(int)date.DayOfWeek);
    range.End = range.Start.AddDays(7).AddSeconds(-1);

    return range;
}

public static DateRange LastWeek(DateTime date)
{
    DateRange range = ThisWeek(date);

    range.Start = range.Start.AddDays(-7);
    range.End = range.End.AddDays(-7);

    return range;
}
9 голосов
/ 02 апреля 2009

В этом году:

DateTime Today = DateTime.Today;
DateTime StartDate = new DateTime(Today.Year,1,1);
DateTime EndDate = StartDate.AddYears(1).AddSeconds(-1);

В этом месяце:

DateTime Today = DateTime.Today;
DateTime StartDate = new DateTime(Today.Year,Today.Month,1);
DateTime EndDate = StartDate.AddMonths(1).AddSeconds(-1);

На этой неделе:

DateTime Today = DateTime.Today;
DateTime StartDate = Today.AddDays(-((int) Today.DayOfWeek));
DateTime EndDate = StartDate.AddDays(7).AddSeconds(-1);

Прошлый год / месяц / неделя - это простые варианты выше. Редактировать: На этой неделе предполагает, что неделя начинается в воскресенье. Вам придется немного изменить код, если ваши недели начнутся в понедельник.

1 голос
/ 02 апреля 2009

Я бы создал фабричный метод, который будет возвращать интерфейс (или делегат, который вы можете выполнить), которому будет передана текущая дата, и вернет диапазон дат для вас на основе реализации.

Конечно, то, какую реализацию вы вернете из фабричного метода, будет определяться значением перечисления, которое вы ему передаете, которое соответствует "этому году", "прошлому году" и т. Д. И т. Д.

0 голосов
/ 02 апреля 2009

Я бы использовал встроенные методы DateTime для добавления и возврата определенных частей даты, чтобы написать функцию, которая будет возвращать интервал.

...