夜间检查功能c#

时间:2018-10-28 08:36:39

标签: c# algorithm function

我们需要2个日期的夜间公式。这应该是一个布尔函数,它接收2个日期(它们之间的时差不超过12小时)并检查夜间时间,夜间时间设置为00:00至6:00 am, 该函数导致以下情况:

1/1/18 20:00- 2/1/18 7:00 true

2/1/18 1:00- 2/1/18 7:00 true

2/1/18 1:00- 2/1/18 5:15 true

1/1/18 20:00- 1/1/18 23:00 false

1/1/18 20:00- 2/1/18 3:30 true

我的工作(并非在所有情况下都有效)

     private bool CheckNightHours(DateTime start, DateTime end)
     {
         var nightStart = new DateTime(start.Year, start.Month, start.Day ,0 ,0, 0);// 00:00;         
         var nightEnd = new DateTime(end.Year, end.Month, end.Day, 6, 0, 0); // 6:00;
         bool result = false;

         if (end < nightStart)
            return false;
         else { 
            if (start > nightStart && end > nightStart)
               result = false;
            else
            if ((end >= nightEnd) || (end > nightStart && end < nightEnd))
               result = true;        
            else   
               return result;
         }
      }

4 个答案:

答案 0 :(得分:2)

DateTime firstTime = new DateTime(2018, 1, 1, 20, 0, 0);
            DateTime secondTime = new DateTime(2018, 1, 2, 7, 0, 0);

            DateTime midNight = new DateTime(firstTime.Year, firstTime.Month, firstTime.Day, 12, 0, 0).AddHours(12);
            DateTime AM6 = midNight.AddHours(6);

            if(firstTime < midNight)
            {
                if(midNight < secondTime)
                    return true;

                return false;
            }
            else
            {
                if (secondTime < AM6)
                    return true;
                return false;
            }

答案 1 :(得分:2)

也许这会起作用

public static bool IsNight(DateTime from, DateTime to)
   => (to > from) && (from < from.Date.AddHours(6) || to < to.Date.AddHours(6) || to > from.Date.AddDays(1));

更新

或更完善,如@ZoharPeled

所建议
public static bool IsNight(DateTime from, DateTime to)
   => (to > from) && ( rom.Hour < 6 || to.Hour < 6 || to > from.Date.AddDays(1));

前提是

  • to大于from(健全性检查)
  • from少于早上6点(所有其他to都是有效的夜晚)
  • to少于早上6点,(其他所有fro上午都是有效的夜晚)
  • tofrom的第二天,必须整晚

我想您可以再添加24小时的健全性检查

注意 :仅当宣布夜间从午夜开始时才有效。

答案 2 :(得分:1)

TheGeneral发布了一个很好的答案,但是它只能在夜间从午夜开始工作。
一个更通用的解决方案是为夜间创建另一个DateTime范围并检查是否有重叠-因此您在正确的轨道上的哪个位置从开始时间和结束时间创建DateTime值,并检查日期范围是否重叠-但用于测试范围是否重叠的代码是错误的。

标签Wiki:

  

查找元素是否重叠的方法是测试一个元素是否在第二个元素结束之前开始,而第二个元素在第一个元素结束之前开始。

因此,更好的代码是这样:

 private bool CheckNightHours(DateTime start, DateTime end)
 {  
     var nightStart = start.Date.AddDay(); 
     var nightEnd = end.Date.AddHours(6);
     bool result = false;

     return nightStart < end && start < nightEnd;
  }

我还简化了用于创建nightStartnightEnd值作为奖励的代码。

答案 3 :(得分:0)

这种选择并不像以前那样优雅,但是我在计算时间(例如数学值)方面有不好的经验。时间格式更改可能会导致常见的过滤器错误。由您决定,您更喜欢什么。

    /// <summary>
    /// 
    /// </summary>
    /// <param name="startTime">First Datetime</param>
    /// <param name="span">12 hours in your case</param>
    /// <returns></returns>
    public bool AnyNightHoursIncluded(DateTime startTime, int span)
    {
        int startHour = Convert.ToInt32(startTime.ToString("HH")); //24 hour format
        for (int i = 0; i < span; i++)
        {
            int actualHourValue = Convert.ToInt32(startTime.AddHours(i).ToString("HH"));
            //from 0:00 to 6:00
            if (actualHourValue >= 0 && actualHourValue < 6)
                return true;      
        }
        return false;
    }