我有两个约会,我需要检查在这些日期中的凌晨1点到凌晨5点之间是否至少花费了2个连续小时。
例如,如果dateFrom为2014-05-05 17:00:00且dateTo为2014-05-06 6:00:00,则表示这两个日期之间的凌晨1点至凌晨5点之间连续花费了2个小时。
时间(1AM和5AM)是可配置的,而不是硬编码的-因此,表示为变量。
到目前为止,这是我所做的:
//The timeFromResidencyRange and timeToResidencyRange are 1AM and 5AM respectively.
//They are collected from two `DateTimePicker` .NET controls.
timeFromResidencyRange = dtpTime1.Value; //For testing, it is 1AM (but can be any time)
timeToResidencyRange = dtpTime2.Value; //For testing, it is 5AM (but can be any time)
private bool IsWithinResidencyRange(DateTime dateFrom, DateTime dateTo, double consecutiveHours)
{
var totalDiff = (dateTo - dateFrom).TotalHours;
if (totalDiff < consecutiveHours)
{
return false;
}
DateTime desireFromDate = new DateTime();
if ((dateFrom.TimeOfDay.Hours < timeToResidencyRange.Hour) || (dateFrom.TimeOfDay.Hours == timeToResidencyRange.Hour && dateFrom.TimeOfDay.Minutes == timeToResidencyRange.Minute && dateFrom.TimeOfDay.Seconds == 0))
{
desireFromDate = dateFrom;
}
else
{
desireFromDate = dateFrom.AddDays(1);
}
var endOfDesireDate = new DateTime(desireFromDate.Year,
desireFromDate.Month,
desireFromDate.Day, timeToResidencyRange.Hour, timeToResidencyRange.Minute, 0);
if ((endOfDesireDate - dateFrom).TotalHours < consecutiveHours)
{
endOfDesireDate = endOfDesireDate.AddDays(1);
}
else
{
return true;
}
desireFromDate = endOfDesireDate.AddHours(-((timeToResidencyRange - timeFromResidencyRange).TotalHours));
return (dateTo - desireFromDate).TotalHours >= consecutiveHours;
}
作为测试用例,我执行了以下操作:
IsWithinResidencyRange(DateTime.Parse("2014-05-05 1:00:00"), DateTime.Parse("2014-05-05 5:00:00"), (double)amountOfHours); //true
IsWithinResidencyRange(DateTime.Parse("2014-05-05 2:30:00"), DateTime.Parse("2014-05-05 5:00:00"), (double)amountOfHours); //true
IsWithinResidencyRange(DateTime.Parse("2014-05-05 1:00:00"), DateTime.Parse("2014-05-06 17:00:00"), (double)amountOfHours); //true
IsWithinResidencyRange(DateTime.Parse("2014-05-05 15:00:00"), DateTime.Parse("2014-05-05 1:59:00"), (double)amountOfHours); //false
IsWithinResidencyRange(DateTime.Parse("2014-05-05 15:00:00"), DateTime.Parse("2014-05-05 2:59:00"), (double)amountOfHours); //false
IsWithinResidencyRange(DateTime.Parse("2014-05-05 15:00:00"), DateTime.Parse("2014-05-06 3:00:00"), (double)amountOfHours); //true
IsWithinResidencyRange(DateTime.Parse("26/08/2013 17:17:13"), DateTime.Parse("26/08/2013 20:20:30"), (double)amountOfHours); //false
IsWithinResidencyRange(DateTime.Parse("26/08/2013 17:17:13"), DateTime.Parse("29/08/2013 20:20:30"), (double)amountOfHours); //true
IsWithinResidencyRange(DateTime.Parse("2014-05-04 1:00:00"), DateTime.Parse("2014-05-06 5:00:00"), (double)amountOfHours); //true
IsWithinResidencyRange(DateTime.Parse("2014-05-05 1:00:00"), DateTime.Parse("2014-05-15 5:00:00"), (double)amountOfHours); //true
IsWithinResidencyRange(DateTime.Parse("2014-05-05 1:00:00"), DateTime.Parse("2014-06-05 5:00:00"), (double)amountOfHours); //true
IsWithinResidencyRange(DateTime.Parse("2014-05-05 3:00:00"), DateTime.Parse("2014-05-05 5:00:00"), (double)amountOfHours); //true
IsWithinResidencyRange(DateTime.Parse("2014-05-05 3:00:00"), DateTime.Parse("2014-05-05 4:59:00"), (double)amountOfHours); //false
IsWithinResidencyRange(DateTime.Parse("2014-05-05 1:25:00"), DateTime.Parse("2014-05-05 2:25:00"), (double)amountOfHours); //false
IsWithinResidencyRange(DateTime.Parse("2014-05-05 1:25:00"), DateTime.Parse("2014-05-05 3:25:00"), (double)amountOfHours); //true
右边的注释是预期的结果-在此范围内,第六个失败了,但是我怀疑其他的都是巧合-否则它们都会起作用,或者全部失败。
有谁知道是什么原因造成的?
考虑到这个问题,我认为可以用更少的逻辑来解决。经过一番思索和思考,我将解决以下问题:
编辑:更新代码以检查给定范围日期中的所有可能范围。EDIT2:现在返回给定范围内的出现次数。
private int IsWithinResidencyRange(DateTime dateFrom, DateTime dateTo, double consecutiveHours){
var dates = new List<DateTime>();
for (var date = dateFrom.Date; date <= dateTo; date = date.AddDays(1))
dates.Add(date);
var occurances = 0;
foreach (var testDate in dates)
{
var testFrom = new DateTime(testDate.Year, testDate.Month, testDate.Day, timeFromResidencyRange.TimeOfDay.Hours, timeFromResidencyRange.TimeOfDay.Minutes,0);
var testTo = new DateTime(testDate.Year, testDate.Month, testDate.Day, timeToResidencyRange.TimeOfDay.Hours, timeToResidencyRange.TimeOfDay.Minutes, 0);
if (WithinFrame(dateFrom, dateTo, consecutiveHours, testFrom, testTo))
occurances++;
}
return occurances;
}
private bool WithinFrame(DateTime from, DateTime to, double consecutiveHours, DateTime rangeFrom, DateTime rangeTo)
{
if (from < rangeFrom)
{
return ((to - rangeFrom).TotalHours >= consecutiveHours);
}
else if (to > rangeTo)
{
return ((rangeTo - from).TotalHours >= consecutiveHours);
}
else
{
//Is completely within range.
return ((to - from).TotalHours >= consecutiveHours);
}
}
基本上,这将检查输入的日期是否与“期望范围”重叠。如果设置的日期在1AM之前开始,它将检查从期望的开始到给定的结束日期至少有两个小时(或您指定的任何值)。
如果它不是在上午5点之前开始而是在下午5点之后结束,则它检查从给定起点到所需终点至少有两个小时的时间。
如果在此范围内,请检查小时总差异是否大于2(或给出的数值)。
希望这个解释很清楚:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句