45

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

ユーザーは開始時刻と終了時刻を設定できるため、通知に邪魔されることはありません (たとえば、夜間)。

したがってTimePicker、ユーザーが設定できる 2 つの s (開始時間と終了時間) がある場合。

ユーザーが と を設定22:00したStartTime07:00EndTimeましょう (これは夜をカバーします)。

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

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

4

7 に答える 7

92

最初にすべてを同じ単位に変換する必要があり(ここではを使用します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);
于 2012-10-21T14:41:00.420 に答える
10

日付なしで 2 回しか収集していないため、2 回が同じ日かどうかを判断する必要があります。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;
}
于 2012-10-21T14:53:27.027 に答える
3
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 は特に を要求しましたが、@Gabe の回答に従って代わりにDateTime使用することをお勧めします。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;
    }
}
于 2012-10-21T14:30:46.593 に答える
2

まっすぐ比較してください。

if(date> startdate && date <enddate)

于 2012-10-21T14:42:18.947 に答える
1

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

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
}

タイムスパンは、dupe から取得したものです。

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
}
于 2012-10-21T14:31:06.200 に答える
1

私はこれを使用しているので、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);
    }
于 2015-11-15T15:06:12.397 に答える