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

C# 什么';从DateTime生成相对日期范围(本周、今年、上月等)的最佳方法是什么?,c#,.net,datetime,relative-date,C#,.net,Datetime,Relative Date,我肯定我不是第一个需要这样做的人,所以我在寻找最好的方法 我有一套单选按钮,可以选择 今年 去年 这个月 上个月 本周 上周 我需要从当前日期(DateTime.Now)生成适当的相对日期范围 例如,如果选择了去年,当前日期为4/2/09 14:45:32,我需要返回1/1/08 00:00:00的开始日期和12/31/08 23:59:59 有什么想法吗?我将创建一个工厂方法,它将返回一个接口(或您可以执行的委托),该接口将被传递当前日期,并根据实现为您返回日期范围 当然,您从factor

我肯定我不是第一个需要这样做的人,所以我在寻找最好的方法

我有一套单选按钮,可以选择

  • 今年
  • 去年
  • 这个月
  • 上个月
  • 本周
  • 上周
我需要从当前日期(
DateTime.Now
)生成适当的相对日期范围

例如,如果选择了
去年
,当前日期为
4/2/09 14:45:32
,我需要返回
1/1/08 00:00:00
的开始日期和
12/31/08 23:59:59


有什么想法吗?

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

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

今年:

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

去年/月/周是上述的简单变化编辑:本周假设本周从周日开始。如果您的工作周从周一开始,您将不得不稍微修改代码。

所有这些都已使用DateTime进行了测试。今天,按照您的要求工作:

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

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

我本周有相同的代码,并意识到添加7天将使您在星期六/星期日午夜到达。如果你只是使用日期,而不是时间,严格来说是8天,所以我编辑了我的,只增加了6天。@Chris:取决于你对“本周”的定义。我通常会想到从周日开始的几周,但有些人会想到周一。易于根据需要修改代码。我重新阅读了问题,您是正确的。我错误地认为他只是想要日期,应该是11:59:59PMI,我最终使用了这个代码,因为它是最完整的,最容易修改以满足我的需要。Kalthes也是完全可以接受的。值得一提的是,美国以外的人认为星期一是一周的开始,而不是星期日。嗨,Chris Doggett非常乐于助人。