wake-up-neo.com

Wie kann man überprüfen, ob DateTime.Now nur für einen Zeitteil zwischen zwei angegebenen DateTimes liegt?

Für meine App muss ich wissen, ob Now() zwischen zwei Werten liegt.

Der Benutzer kann eine Start- und eine Endzeit einstellen, damit er nicht durch eine Benachrichtigung (beispielsweise während der Nacht) gestört wird.

Wenn also zwei TimePickers (Start- und Endzeit) vorhanden sind, die der Benutzer einstellen kann.

Nehmen wir an, der Benutzer setzt 22:00 für die StartTime und 07:00 für die EndTime (dies würde die Nacht umfassen).

Wie kann ich überprüfen, ob der DateTime.Now zwischen der ausgewählten Start- und Endzeit liegt?

EDIT: Ich möchte nur, dass dies mit dem Stunden- und Minuten-Teil funktioniert. Wenn der Benutzer die Start- und Endzeit einstellt, sollte dies für jede Nacht funktionieren.

20
Niels

Zuerst müssen Sie alles in die gleichen Einheiten umwandeln (wir verwenden TimeSpan), dann müssen Sie sehen, ob die Start-End-Zeiten Mitternacht kreuzen und schließlich Ihren Vergleich anhand der Ergebnisse dieser Prüfung durchführen:

// 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);

Hier ist eine Funktion, um es für Sie zu tun:

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

Man würde es gerne so nennen:

bool silenceAlarm = TimeBetween(DateTime.Now, StartTime.Value, EndTime.Value);
63
Gabe

Da Sie sich nur zweimal ohne Datum versammeln, müssen Sie herausfinden, ob die beiden Zeiten vom selben Tag stammen oder nicht. Wenn Sie die Variable StartTime, EndTime und Now in TimeSpans eingeben:

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;
}
5
yhw42
    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 <= -1)
        {
            return true;
        }
        return false;
    }
3
Rohit Sachan
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;

Update 08-Jun-2016
Nicht sicher, warum der Downvote angemessen war, da dies eine funktionierende Lösung ist. Das OP hat speziell nach DateTime gefragt, jedoch empfehle ich die Verwendung von TimeSpan anstelle der Antwort von @Gabe.

Hier ist eine funktionierende Funktion gemäß meiner Antwort:

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

Hier ist eine funktionierende Geige: https://dotnetfiddle.net/vZCXqv .

Vollständiger Code:

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;
    }
}
2
Paul Fleming

Ich benutze das, damit Sie DateTime direkt übergeben können:

        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);
    }
1
Suplanus

Dupe von Finden Sie heraus, ob die aktuelle Zeit in einen Zeitbereich fällt

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
}

Die Zeitspanne wurde wiederum von Betrogenem übernommen.

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
}
1
stan

Mach einfach einen direkten Vergleich. 

if (Datum> Startdatum && Datum <Enddatum)

0
iefpw