Как проверить, находится ли DateTime.Now между двумя указанными DateTimes только для части времени?

Для моего приложения мне нужно знать, еслиNow() находится между двумя значениями.

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

Так что, если есть дваTimePickers (время начала и окончания), которое может установить пользователь.

Допустим, пользователь устанавливает22:00 дляStartTime а также07:00 дляEndTime (это будет охватывать ночь).

Как я могу проверить, еслиDateTime.Now находится между выбранным временем начала и окончания?

РЕДАКТИРОВАТЬ: Я только хочу, чтобы это работало с часами и минутами. Так что, если пользователь устанавливает время начала и окончания, это должно работать каждую ночь.

 Gabe21 окт. 2012 г., 16:52
Боюсь, что из полдюжины ответов мой - единственный ответ, который, похоже, сработает для вашего примера.
 Flow27 окт. 2012 г., 11:10
Не могли бы вы уточнить, почему?

Ответы на вопрос(7)

если (дата> Дата начала && дата < Дата окончания)

 Arjan21 окт. 2012 г., 17:52
Как бы вы получили дату? Смотри, Гейбs и yhw42 'с ответами.
DateTime nowDate = DateTime.Now;
// set these to today + time from time picker
DateTime startDate = new DateTime(nowDate.Year, nowDate.Month, nowDate.Day,
    selectedStart.Hour, selectedStart.Minute, 0);
DateTime endDate = new DateTime(nowDate.Year, nowDate.Month, nowDate.Day, 
    selectedEnd.Hour, selectedEnd.Minute, 0);
bool isBetween = nowDate < endDate && nowDate > startDate;

Обновление 08-июн-2016

Не уверен, почему downvote было уместно, так как это рабочее решение. ФП попросил специальноDateTimeОднако я рекомендую использоватьTimeSpan вместо этого согласно ответу @Gabe.

Вот's рабочая функция согласно моему ответу:

public static bool TimeBetween(DateTime check, DateTime start, DateTime end, bool inclusive = true)
{
    var from = new DateTime(check.Year, check.Month, check.Day, 
        start.Hour, start.Minute, start.Second, start.Millisecond);
    var to = new DateTime(check.Year, check.Month, check.Day, 
        end.Hour, end.Minute, end.Second, end.Millisecond);

    if (inclusive)
        return from <= check && to >= check;

    return from < check && to > check;
}

Вот'рабочая скрипка:https://dotnetfiddle.net/vZCXqv.

Полный код:

using System;

public class Program
{
    public static void Main()
    {
        var start = new DateTime(1, 1, 1, 9, 0, 0);
        var end = new DateTime(1, 1, 1, 17, 0, 0);

        Console.WriteLine("{0} - Too early",                TimeBetween(new DateTime(2014, 1, 1, 08, 59, 59, 999), start, end));
        Console.WriteLine("{0} - On start time exclusive",  TimeBetween(new DateTime(2014, 1, 1, 09, 00, 00, 000), start, end, false));
        Console.WriteLine("{0} - On start time inclusive",  TimeBetween(new DateTime(2014, 1, 1, 09, 00, 00, 000), start, end));
        Console.WriteLine("{0} - After start time",         TimeBetween(new DateTime(2014, 1, 1, 09, 00, 00, 001), start, end));        
        Console.WriteLine("{0} - Before end time",          TimeBetween(new DateTime(2014, 1, 1, 16, 59, 59, 999), start, end));
        Console.WriteLine("{0} - On end time inclusive",    TimeBetween(new DateTime(2014, 1, 1, 17, 00, 00, 000), start, end));
        Console.WriteLine("{0} - On end time exclusive",    TimeBetween(new DateTime(2014, 1, 1, 17, 00, 00, 000), start, end, false));
        Console.WriteLine("{0} - Too late",                 TimeBetween(new DateTime(2014, 1, 1, 17, 00, 00, 001), start, end));
    }

    public static bool TimeBetween(DateTime check, DateTime start, DateTime end, bool inclusive = true)
    {
        var from = new DateTime(check.Year, check.Month, check.Day, start.Hour, start.Minute, start.Second, start.Millisecond);
        var to = new DateTime(check.Year, check.Month, check.Day, end.Hour, end.Minute, end.Second, end.Millisecond);

        if (inclusive)
            return from <= check && to >= check;

        return from < check && to > check;
    }
}
 Paul Fleming21 окт. 2012 г., 16:53
@Niels. Правильный. Если вы хранитеначало = 10 января 2012 09:00 " приведенный выше код будет работать в течение любого дня.
 Arjan21 окт. 2012 г., 17:49
Нет, см. Гейбs и yhw42 's anwers, @Niels.
 Niels21 окт. 2012 г., 16:52
Это будет работать независимо от даты, верно? Так что, если пользователь устанавливает время и дату, это всегда будет работать?

        public static bool TimeBetween(DateTime time, DateTime startDateTime, DateTime endDateTime)
    {
        // get TimeSpan
        TimeSpan start = new TimeSpan(startDateTime.Hour, startDateTime.Minute, 0);
        TimeSpan end = new TimeSpan(endDateTime.Hour, endDateTime.Minute, 0);

        // convert datetime to a TimeSpan
        TimeSpan now = time.TimeOfDay;
        // see if start comes before end
        if (start < end)
            return start <= now && now <= end;
        // start is after end, so do the inverse comparison
        return !(end < now && now < start);
    }

ДупеНайти, если текущее время попадает в диапазон времени

DateTime start = new DateTime(2009, 12, 9, 10, 0, 0));
DateTime end = new DateTime(2009, 12, 10, 12, 0, 0));
DateTime now = DateTime.Now;

if ((now > start) && (now < end))
{
   //match found
}

Timespan, опять же, взят из дупе.

TimeSpan start = new TimeSpan(10, 0, 0);
TimeSpan end = new TimeSpan(12, 0, 0);
TimeSpan now = DateTime.Now.TimeOfDay;

if ((now > start) && (now < end))
{
   //match found
}
 stan21 окт. 2012 г., 16:36
@CodesInChaos не проблема.
 CodesInChaos21 окт. 2012 г., 16:34
Я думаю, что ОП хочет использовать только часть времени, игнорируя часть даты
 Arjan21 окт. 2012 г., 17:51
Это все еще не хорошо; увидеть Гейбаs и yhw42 'с ответами.

вам необходимо выяснить, относятся ли эти два раза к одному и тому же дню или нет. Если вы положите,StartTimeEndTime, а такжеNow в:TimeSpans

if (StartTime > EndTime) 
{
    // the range crosses midnight, do the comparisons independently
    return (StartTime < Now) || (Now < EndTime);
}
else 
{
    // the range is on the same day, both comparisons must be true
    return StartTime < Now && Now < EndTime;
}
Решение Вопроса

ьзоватьTimeSpan), тогда вам нужно посмотреть, пересекаются ли времена начала и окончания в полночь, и, наконец, провести сравнение на основе результатов этой проверки:

// convert everything to TimeSpan
TimeSpan start = new TimeSpan(22, 0, 0);
TimeSpan end = new TimeSpan(07, 0, 0);
TimeSpan now = DateTime.Now.TimeOfDay;
// see if start comes before end
if (start < end)
    return start <= now && now <= end;
// start is after end, so do the inverse comparison
return !(end < now && now < start);

Вот'Это функция, которая сделает это за вас:

bool TimeBetween(DateTime datetime, TimeSpan start, TimeSpan end)
{
    // convert datetime to a TimeSpan
    TimeSpan now = datetime.TimeOfDay;
    // see if start comes before end
    if (start < end)
        return start <= now && now <= end;
    // start is after end, so do the inverse comparison
    return !(end < now && now < start);
}

Вы бы назвали это так:

bool silenceAlarm = TimeBetween(DateTime.Now, StartTime.Value, EndTime.Value);
    public static bool isCurrenctDateBetween(DateTime fromDate, DateTime toDate)
    {
        DateTime curent = DateTime.Now.Date;
        if (fromDate.CompareTo(toDate) >= 1)
        {
            MessageBox.Show("From Date shouldn't be grater than To Date", "DateRange",MessageBoxButton.OKCancel, MessageBoxImage.Warning);
        }
        int cd_fd = curent.CompareTo(fromDate);
        int cd_td = curent.CompareTo(toDate);

        if (cd_fd == 0 || cd_td == 0)
        {
            return true;
        }

        if (cd_fd >= 1 && cd_td 

Ваш ответ на вопрос