获取两个日期时间之间的(地板)小时数列表
我写了一个函数,以包含两个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感受到我在重新发明轮子。
是啊,这样的事情应该工作更好地为您提供:
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);
}
}
虽然没有构造函数我知道这需要4个int参数,所以我应该'新的DateTime(start.Year,start.Month,start.Day,start.Hour,0,0)' – 2012-04-17 19:14:51
这也应该与OP中的代码不同,可以正确处理夏令时跳转。 – Servy 2012-04-17 19:15:14
@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;
}
如果可能的话,它可能会更好返回一个'IEnum而不是一个列表,而是一个。如果你确实需要一个列表,你总是可以调用'ToList',并且它允许不产生每一个结果的可能性。 –
Servy
2012-04-17 19:14:29