web-dev-qa-db-ja.com

DateTime.Nowが指定された2つのDateTimeの間にあるかどうかを時間部分のみで確認する方法

私のアプリでは、Now()が2つの値の間にあるかどうかを知る必要があります。

ユーザーは、開始時間と終了時間を設定して、通知などで邪魔されないようにすることができます(夜間など)。

そのため、ユーザーが設定できるTimePickers(開始時間と終了時間)が2つある場合。

ユーザーがStartTime22:00を設定し、EndTime07:00を設定するとします(これは夜をカバーします)。

DateTime.Nowが選択した開始時間と終了時間の間にあるかどうかを確認するにはどうすればよいですか?

編集:これは、時間と分の部分でのみ動作します。したがって、ユーザーが開始時刻と終了時刻を設定した場合、これは毎晩機能します。

23
Niels

最初にすべてを同じ単位に変換する必要があり(TimeSpanを使用します)、開始終了時間が午前0時を超えるかどうかを確認し、最後にそのチェックの結果に基づいて比較を行う必要があります。

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

日付なしで2回だけ収集しているので、2回が同じ日からのものかどうかを把握する必要があります。 StartTimeEndTime、およびNowTimeSpansに入れると:

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

2016年6月8日更新
これが有効なソリューションであるため、ダウン投票が適切であった理由がわかりません。 OPはDateTimeを具体的に要求しましたが、@ Gabeの回答に従って、代わりにTimeSpanを使用することをお勧めします。

私の答えによると、ここに機能があります:

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

これを使用するので、DateTimeを直接渡すことができます。

        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

現在の時間が時間範囲内にある場合に検索 の重複

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 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
sed

単純に比較するだけです。

if(日付>開始日&&日付<終了日)

0
iefpw