функция проверки в ночное время c # - PullRequest
0 голосов
/ 28 октября 2018

Нам нужна ночная формула из 2 дат.Предполагается, что это логическая функция, которая получает 2 даты (разница во времени не более 12 часов) и проверяет ночные часы, ночные часы устанавливаются с 00:00 до 6:00 утра. Функция работает в следующих случаях:

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:00false

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 голосов
/ 28 октября 2018

TheGeneral опубликовал хороший ответ, но он будет работать только с ночного времени в полночь.
Более общим решением было бы создание другого диапазона DateTime для ночного времени и проверка на совпадения - чтобы вы были на правильном пути, создавая DateTime значения из времени начала и времени окончания, и проверяли, перекрывается ли диапазон дат - но код для проверки правильности перекрытия диапазонов.

Из тега вики:

Чтобы определить, перекрываются ли элементы или нет, нужно проверить, начинается ли один из элементов до того, как заканчивается второй, а второй начинается до того, как заканчивается первый.

Так что лучший код будет такой:

 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;
  }

Я также упростил код, который вы использовали для создания значений nightStart и nightEnd в качестве бонуса.

0 голосов
/ 28 октября 2018

Может быть, это будет работать

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 m будут действительной ночью)
  • to на следующий день до from,должно быть больше ночи

Вы можете добавить еще одну проверку работоспособности на 24 часа, я думаю

Примечание : это будет работать только с ночного времениобъявлено начало в полночь

0 голосов
/ 28 октября 2018

Эта альтернатива не такая элегантная, как раньше, но у меня плохой опыт от подсчета времени как математических значений.Это может привести к общим ошибкам фильтра при изменении формата времени.До вас, что вы предпочитаете.

    /// <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;
    }
0 голосов
/ 28 октября 2018
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;
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...