代码之家  ›  专栏  ›  技术社区  ›  Redwood

从日期时间中生成相对日期范围(本周、今年、上月等)的最佳方法是什么?

  •  8
  • Redwood  · 技术社区  · 17 年前

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

    我有一组带有选项的单选按钮,例如

    • 今年
    • 去年
    • 这个月
    • 上个月
    • 本周
    • 上周

    我需要从当前日期产生适当的相对日期范围( DateTime.Now )

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

    有什么想法吗?

    4 回复  |  直到 7 年前
        1
  •  23
  •   Chris Doggett    17 年前

    所有这些都已使用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;
    }
    
        2
  •  9
  •   Keltex    17 年前

    今年:

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

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

        3
  •  1
  •   casperOne    17 年前

    我将创建一个工厂方法,它将返回一个接口(或一个可以执行的委托),该接口将通过当前日期,并基于实现为您返回日期范围。

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

        4
  •  0
  •   eppdog    17 年前

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

    推荐文章