获取两个日期时间之间的(地板)小时数列表

问题描述:

我写了一个函数,以包含两个DateTime之间的小时数列表。获取两个日期时间之间的(地板)小时数列表

但最终它看起来并不很容易,它使我想单元测试它,即使我正在处理的项目根本没有进行单元测试。

所以我的问题是,有没有写这个?:更清晰,或者有效的方式

代码:

private List<DateTime> GetHoursForEvent(DateTime start, DateTime end) 
{ 
    var hours = new List<DateTime>(); 

    DateTime startFloor = Convert.ToDateTime(start.ToString("MM/dd/yyyy HH:00:00")); 
    DateTime endFloor = Convert.ToDateTime(end.ToString("MM/dd/yyyy HH:00:00")); 

    for (double dblDate = startFloor.ToOADate(); 
     dblDate <= endFloor.ToOADate(); 
     dblDate += (1.0/24.0)) 
    { 
     hours.Add(DateTime.FromOADate(dblDate)); 
    } 

    return hours; 
} 

输入:

DateTime start = Convert.ToDateTime("2012-04-01 04:22:00"); 
DateTime end = Convert.ToDateTime("2012-04-02 00:05:00"); 

结果:

2012-04-01 04:00:00 
2012-04-01 05:00:00 
2012-04-01 06:00:00 
2012-04-01 07:00:00 
2012-04-01 08:00:00 
2012-04-01 09:00:00 
2012-04-01 10:00:00 
2012-04-01 11:00:00 
2012-04-01 12:00:00 
2012-04-01 13:00:00 
2012-04-01 14:00:00 
2012-04-01 15:00:00 
2012-04-01 16:00:00 
2012-04-01 17:00:00 
2012-04-01 18:00:00 
2012-04-01 19:00:00 
2012-04-01 20:00:00 
2012-04-01 21:00:00 
2012-04-01 22:00:00 
2012-04-01 23:00:00 
2012-04-02 00:00:00 

I感受到我在重新发明轮子。

+3

如果可能的话,它可能会更好返回一个'IEnum而不是一个列表,而是一个。如果你确实需要一个列表,你总是可以调用'ToList',并且它允许不产生每一个结果的可能性。 – Servy 2012-04-17 19:14:29

是啊,这样的事情应该工作更好地为您提供:

private List<DateTime> GetHoursForEvent(DateTime start, DateTime end) 
{ 
    var hours = new List<DateTime>(); 
    var current = new DateTime(start.Year, start.Month, start.Day, start.Hour, 0, 0); 
    while(current <= end) 
    { 
     hours.Add(current); 
     current = current.AddHours(1); 
    } 
    return hours; 
} 

你甚至可以制作成流方法这一点,除非有需要返回List一个具体的理由:

private IEnumerable<DateTime> GetHoursForEvent(DateTime start, DateTime end) 
{ 
    var current = new DateTime(start.Year, start.Month, start.Day, start.Hour, 0, 0); 
    while(current <= end) 
    { 
     yield return current; 
     current = current.AddHours(1); 
    } 
} 
+2

虽然没有构造函数我知道这需要4个int参数,所以我应该'新的DateTime(start.Year,start.Month,start.Day,start.Hour,0,0)' – 2012-04-17 19:14:51

+2

这也应该与OP中的代码不同,可以正确处理夏令时跳转。 – Servy 2012-04-17 19:15:14

+0

@ErikPhilips:修正,谢谢。 – StriplingWarrior 2012-04-17 19:18:13

尝试使用此代码

private List<DateTime> GetHoursForEvent(DateTime start, DateTime end) 
    { 
     List<DateTime> hours = new List<DateTime>(); 
     while (start < end) 
     { 
      hours.Add(start); 
      start = start.AddHours(1); 
     } 
     return hours; 
    }