在给定两个日期的情况下,检查一个时间范围内是否至少花费了两个小时

点网

我有两个约会,我需要检查在这些日期中的凌晨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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

计算给定时间范围内两个日期时间之间的小时数

来自分类Dev

检查两个int值是否在给定范围内的函数

来自分类Dev

在给定的时间间隔内,一个时间范围有多少小时?

来自分类Dev

比较时间:检查给定时间是否在另一个时间范围内

来自分类Dev

比较时间:检查给定时间是否在另一个时间范围内

来自分类Dev

从两个日期时间之间的时差返回另一个时间

来自分类Dev

确定两个日期是否在允许的时间范围内

来自分类Dev

检查一定范围内的两个日期

来自分类Dev

在给定两个点和半径的情况下找到圆的中心

来自分类Dev

在给定两个提交哈希值的情况下找出提交数量

来自分类Dev

将两个日期时间串联到一个字符串日期范围内

来自分类Dev

在两个表的日期范围内加入/合并

来自分类Dev

检查两个列表是否共享至少一个元素

来自分类Dev

Java如何比较当前时间是否在两个时间范围内

来自分类Dev

检查表的一个时间序列列是否具有两个相邻的时间点,它们的间隔大于特定长度

来自分类Dev

如何比较两个时间戳以查看一个时间戳是否晚了超过特定的分钟数?

来自分类Dev

如何在一个范围内相加两个随机数?

来自分类Dev

给定N个排序的数组,请检查是否有两个包含至少两个公共元素的数组

来自分类Dev

在pyspark中的两个时间戳之间创建一个时间戳数组

来自分类Dev

选择日期范围内的所有行,至少有一个行发生在给定的最后一个月

来自分类Dev

检查两个半径范围内的地理位置是否在彼此的半径范围内

来自分类Dev

检查是否有两个以上的日期范围重叠

来自分类Dev

MySQL检查两个日期范围是否与输入重叠

来自分类Dev

检查是否有两个以上的日期范围重叠

来自分类Dev

在给定两个列表的情况下,没有获得用于创建元组列表的正确输出

来自分类Dev

Python:在给定两个预制函数的情况下,如何有效选择要使用的函数?

来自分类Dev

在给定两个列表的情况下,没有获得用于创建元组列表的正确输出

来自分类Dev

Python:在给定特定键顺序的情况下,如何将两个分组和重塑列表

来自分类Dev

如何检查数据表中每一行的列值是否在另两个范围内

Related 相关文章

  1. 1

    计算给定时间范围内两个日期时间之间的小时数

  2. 2

    检查两个int值是否在给定范围内的函数

  3. 3

    在给定的时间间隔内,一个时间范围有多少小时?

  4. 4

    比较时间:检查给定时间是否在另一个时间范围内

  5. 5

    比较时间:检查给定时间是否在另一个时间范围内

  6. 6

    从两个日期时间之间的时差返回另一个时间

  7. 7

    确定两个日期是否在允许的时间范围内

  8. 8

    检查一定范围内的两个日期

  9. 9

    在给定两个点和半径的情况下找到圆的中心

  10. 10

    在给定两个提交哈希值的情况下找出提交数量

  11. 11

    将两个日期时间串联到一个字符串日期范围内

  12. 12

    在两个表的日期范围内加入/合并

  13. 13

    检查两个列表是否共享至少一个元素

  14. 14

    Java如何比较当前时间是否在两个时间范围内

  15. 15

    检查表的一个时间序列列是否具有两个相邻的时间点,它们的间隔大于特定长度

  16. 16

    如何比较两个时间戳以查看一个时间戳是否晚了超过特定的分钟数?

  17. 17

    如何在一个范围内相加两个随机数?

  18. 18

    给定N个排序的数组,请检查是否有两个包含至少两个公共元素的数组

  19. 19

    在pyspark中的两个时间戳之间创建一个时间戳数组

  20. 20

    选择日期范围内的所有行,至少有一个行发生在给定的最后一个月

  21. 21

    检查两个半径范围内的地理位置是否在彼此的半径范围内

  22. 22

    检查是否有两个以上的日期范围重叠

  23. 23

    MySQL检查两个日期范围是否与输入重叠

  24. 24

    检查是否有两个以上的日期范围重叠

  25. 25

    在给定两个列表的情况下,没有获得用于创建元组列表的正确输出

  26. 26

    Python:在给定两个预制函数的情况下,如何有效选择要使用的函数?

  27. 27

    在给定两个列表的情况下,没有获得用于创建元组列表的正确输出

  28. 28

    Python:在给定特定键顺序的情况下,如何将两个分组和重塑列表

  29. 29

    如何检查数据表中每一行的列值是否在另两个范围内

热门标签

归档