【发布时间】:2014-12-16 08:45:00
【问题描述】:
我有两个日期,我需要检查在这些日期的凌晨 1 点到 5 点之间是否至少连续花费了 2 个小时。
例如,如果 dateFrom 是 2014-05-05 17:00:00 并且 dateTo 是 2014-05-06 6:00:00,这意味着在这两个日期之间的凌晨 1 点到 5 点之间连续花费了 2 个小时.
时间(凌晨 1 点和凌晨 5 点)是可配置的,而不是硬编码的 - 因此,表示为变量。
这是我到目前为止所做的:
//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
右边的 cmets 应该是预期的结果 - 在这个集合中,第 6 个失败了,但我怀疑其他的工作是巧合 - 否则他们会全部工作,或者全部失败。
有人知道是什么原因造成的吗?
【问题讨论】:
-
你的哪些测试失败了?
-
在该集合中,第 6 个失败了,但我怀疑其他人的工作是巧合 - 否则他们会全部工作,或者全部失败。
-
能否请您添加 1AM 和 5AM 变量的声明?
-
什么是
timeToResidencyRange?如果您可以在代码中添加一些 cmets 来解释可能对我们有所帮助的逻辑 -
你们说的都是对的——很抱歉。现在编辑它。