現在の時刻が時間範囲内にあるかどうかを確認します


147

.NET 3.5の使用

現在の時刻が時間範囲内にあるかどうかを確認したい。

これまでのところ、私は現在の流れを持っています:

DateTime currentTime = new DateTime();
currentTime.TimeOfDay;

時間範囲を変換して比較する方法については説明しません。これはうまくいくでしょうか?

if (Convert.ToDateTime("11:59") <= currentTime.TimeOfDay 
    && Convert.ToDateTime("13:01") >= currentTime.TimeOfDay)
{
   //match found
}

UPDATE1:皆さんの提案に感謝します。TimeSpan関数についてはよく知りませんでした。



3
真夜中の横断について心配する必要がありますか?
gjutras

1
真夜中を越えることは問題ではありませんが、真夜中にまたがる何かは私のプログラミング経験の悩みの種です...
John M

回答:


258

時刻の使用を確認するには:

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

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

絶対時間を使用する場合:

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

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

一致の数を数える方法は?たとえば、範囲内の土曜日と日曜日の数を数えたいと思います。
ピビー2013

@pmbiesiada:これは完全に元の質問(および回答)の範囲外です。あなたはこれを新しい質問にすべきですが、もしこのような何かが以前に答えられたなら、ここでSOで検索してください。幸運を。
フランクボラック2013

1
別の日に別の時間がある場合はどうなりますか?それを比較するのは簡単ですか?stackoverflow.com/questions/22769557/...
SearchForKnowledge

@SearchForKnowledge:何を比較しますか?達成したいことを具体的に説明するか、例を挙げてください。
フランクボラック2014

4
以下の答えが受け入れられるはずです...これは、たとえば22:00:00から02:00:00までのTimeSpansをチェックしません...
FranzHuber23

117

ここではいくつかの良い答えがありますが、開始時刻が終了時刻とは異なる日になっているケースはカバーされていません。日の境界をまたぐ必要がある場合は、次のような方法が役立ちます。

TimeSpan start = TimeSpan.Parse("22:00"); // 10 PM
TimeSpan end = TimeSpan.Parse("02:00");   // 2 AM
TimeSpan now = DateTime.Now.TimeOfDay;

if (start <= end)
{
    // start and stop times are in the same day
    if (now >= start && now <= end)
    {
        // current time is between start and stop
    }
}
else
{
    // start and stop times are in different days
    if (now >= start || now <= end)
    {
       // current time is between start and stop
    }
}

この例では、時間の境界は包括的であり、これはとの間の差が24時間未満であることを前提startとしていstopます。


1
別の日に別の時間がある場合はどうなりますか?それを比較するのは簡単ですか?stackoverflow.com/questions/22769557/...
SearchForKnowledge

良い点、それは理にかなっています。測定された時間が真夜中を過ぎた場合、これがまだ正しい唯一の答えになります。
サンセットクエスト2015年

1
ありがとう、何時間も試してみて11:57 pmこれはうまくいった: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
shaijut

1
有難うございます。答えは簡単に聞こえますが、概念化するのは少し厄介です。
サム私はモニカを復活させる2016

これは素晴らしい答えです。DateTime特定の時間が特定の営業時間内かどうかを判断するメソッドを書いています。営業時間は同じ日にすることもできますが、2日間にわたることもあります(午後3時〜午前1時など)。
ドリュー

17
if (new TimeSpan(11,59,0) <= currentTime.TimeOfDay && new TimeSpan(13,01,0) >=  currentTime.TimeOfDay)
{
   //match found
}

文字列をTimeSpanに解析したい場合は、次を使用できます。

    TimeSpan start = TimeSpan.Parse("11:59");
    TimeSpan end = TimeSpan.Parse("13:01");

ありがとう、何時間も試してみて11:57 pmこれはうまくいった: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
shaijut

16

このための単純な小さな拡張関数:

public static bool IsBetween(this DateTime now, TimeSpan start, TimeSpan end)
{
    var time = now.TimeOfDay;
    // If the start time and the end time is in the same day.
    if (start <= end)
        return time >= start && time <= end;
    // The start time and end time is on different days.
    return time >= start || time <= end;
}

3
良い追加アンドレ。別の日のケースについてOR比較を行うとは考えていなかったでしょう。
David

3
すばらしい小さなコードですが、1つの問題があります。同じ開始時刻と終了時刻を指定した場合はどうなりますか。1つの仮定は、24時間に及ぶことを意味する可能性があります。つまり、チェックstart <= endを変更する必要のある状態を意味しstart < end、別の仮定は、それが同じ日にあるということですが、これが当てはまる場合、失敗する可能性があります。ミリ秒が含まれていて範囲外になるため、Now.TimeOfDayを使用します。
ティエリー

@Thierry Nice catch :)修正してみてください。
–AndréSnede Kock 2018

14

C#でTimeRangeオブジェクトを使用して、目標を達成してください。

TimeRange timeRange = new TimeRange();
timeRange = TimeRange.Parse("13:00-14:00");

bool IsNowInTheRange = timeRange.IsIn(DateTime.Now.TimeOfDay);
Console.Write(IsNowInTheRange);

ここで、TimeRangeの使用例を取得しました


12
TimeRangeはC#ライブラリのクラスではありません。上記のリンクからダウンロードできる外部クラスです。
Jpsy

6

TimeOfDayプロパティが返すTimeSpan値を。

次のコードを試してください:

TimeSpan time = DateTime.Now.TimeOfDay;

if (time > new TimeSpan(11, 59, 00)        //Hours, Minutes, Seconds
 && time < new TimeSpan(13, 01, 00)) {
    //match found
}

また、new DateTime()と同じでDateTime.MinValue、常にに等しくなり1/1/0001 12:00:00 AMます。(値の型に空でないデフォルト値を含めることはできません)を使用しますDateTime.Now


2

あなたは非常に近いです。問題は、DateTimeとTimeOfDayを比較していることです。必要なことは、Convert.ToDateTime()関数の最後に.TimeOfDayプロパティを追加することです。


2

これは、日境界のケースを処理するためにより簡単ですか?:)

TimeSpan start = TimeSpan.Parse("22:00");  // 10 PM
TimeSpan end = TimeSpan.Parse("02:00");    // 2 AM
TimeSpan now = DateTime.Now.TimeOfDay;

bool bMatched = now.TimeOfDay >= start.TimeOfDay &&
                now.TimeOfDay < end.TimeOfDay;
// Handle the boundary case of switching the day across mid-night
if (end < start)
    bMatched = !bMatched;

if(bMatched)
{
    // match found, current time is between start and end
}
else
{
    // otherwise ... 
}

0

Linqを使用すると、これによってこれを簡略化できます

 Enumerable.Range(0, (int)(to - from).TotalHours + 1)
            .Select(i => from.AddHours(i)).Where(date => date.TimeOfDay >= new TimeSpan(8, 0, 0) && date.TimeOfDay <= new TimeSpan(18, 0, 0))

0
 using System;

 public class Program
 {
    public static void Main()
    {
        TimeSpan t=new TimeSpan(20,00,00);//Time to check

        TimeSpan start = new TimeSpan(20, 0, 0); //8 o'clock evening

        TimeSpan end = new TimeSpan(08, 0, 0); //8 o'clock Morning

        if ((start>=end && (t<end ||t>=start))||(start<end && (t>=start && t<end)))
        {
           Console.WriteLine("Mached");
        }
        else
        {
            Console.WriteLine("Not Mached");
        }

    }
 }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.