从DateTime生成相对日期范围(本周,今年,上个月等)的最佳方法是什么?

时间:2009-04-02 18:56:06

标签: c# .net datetime relative-date

我确信我不是第一个需要这样做的人,所以我正在寻找最佳方式。

我有一组带有

等选项的单选按钮
  • 今年
  • 去年
  • 本月
  • 上个月
  • 本周
  • 上周

我需要从当前日期(DateTime.Now)生成正确的相对日期范围。

例如,如果选择Last Year且当前日期为4/2/09 14:45:32,我需要返回1/1/08 00:00:00的开始日期和12/31/08 23:59:59的结束日期。

有什么想法吗?

4 个答案:

答案 0 :(得分:24)

所有这些都已经使用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;
}

答案 1 :(得分:9)

今年:

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);

上一年/月/周是上面的简单变化。 编辑: 本周假设星期日开始。如果您的周数从星期一开始,则必须稍微修改一下代码。

答案 2 :(得分:1)

我会创建一个工厂方法,它将返回一个接口(或你可以执行的委托),它将传递当前日期并根据实现返回你的日期范围。

当然,您从工厂方法返回的实现将由您传递给它的枚举值决定,该枚举对应于“今年”,“去年”等等。

答案 3 :(得分:0)

我会使用DateTime内置方法添加并返回日期的特定部分来编写一个返回间隔的函数。