Geçerli zamanın bir zaman aralığına denk gelip gelmediğini bulun


151

.NET 3.5 kullanma

Geçerli zamanın bir zaman aralığına denk gelip gelmediğini belirlemek istiyorum.

Şimdiye kadar mevcut zamanım var:

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

Zaman aralığının nasıl dönüştürüleceğini ve karşılaştırılacağını boş bırakıyorum. Bu işe yarar mı?

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

UPDATE1: Önerileriniz için herkese teşekkürler. TimeSpan işlevine aşina değildim.



3
Gece yarısını geçmekle ilgilenmeniz gerekiyor mu?
gjutras

1
gece yarısını geçmek bir endişe değil, ancak gece yarısını kapsayan herhangi bir şey, programlama deneyimimin bir sıkıntısıdır ...
John M

Yanıtlar:


265

Günün bir saatini kullanmak için:

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
}

Mutlak zamanlar için şunu kullanın:

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
}

Eşleşme sayısı nasıl hesaplanır? Örneğin, aralıkta kaç cumartesi ve pazar olduğunu saymak istiyorum.
pbies

@pmbiesiada: Bu tamamen orijinal sorunun (ve cevabın) kapsamı dışında. Bunu yeni bir soru yapmalısınız, ancak daha önce böyle bir şey yanıtlanmışsa burada SO'da bir arama yapın. İyi şanslar.
Frank Bollack

2
Ya farklı günler için farklı zamanlar varsa? Bunu karşılaştırmak kolay mı? stackoverflow.com/questions/22769557/…
SearchForKnowledge

@SearchForKnowledge: Ne için karşılaştırmalıyım? Lütfen neyi başarmak istediğiniz konusunda daha spesifik olun veya bazı örnekler verin.
Frank Bollack

6
Aşağıdaki cevap kabul edilen cevap olmalıdır ... Bu, günler içindeki TimeSpans'ı kontrol etmez, örneğin 22:00:00 ile 02:00:00 arası ...
FranzHuber23

122

Burada bazı iyi yanıtlar var, ancak hiçbiri başlangıç ​​saatinizin bitiş saatinizden farklı bir günde olması durumunu kapsamıyor. Gün sınırını aşmanız gerekiyorsa, bunun gibi bir şey yardımcı olabilir:

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

Bu örnekte zaman sınırlarının kapsayıcı olduğunu ve bunun hala startve arasında 24 saatlik bir farkın olduğunu varsaydığını unutmayın stop.


1
Ya farklı günler için farklı zamanlar varsa? Bunu karşılaştırmak kolay mı? stackoverflow.com/questions/22769557/…
SearchForKnowledge

İyi nokta, bu mantıklı. Ölçülen zaman gece yarısından geçerse, bu hala doğru olabilecek tek cevap olacaktır.
Sunsetquest

1
teşekkür ederim, saatler sonra denedim 11:57 pmve bu işe yaradı: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
shaijut

1
Bunun için teşekkür ederim. Cevabı bulmak basit görünüyor, ancak kavramsallaştırmak biraz garip.
Sam, Monica'yı Yeniden

Bu harika bir cevap. Belirli bir DateTimesaatin belirtilen iş saatleri içinde olup olmadığını belirlemek için bir yöntem yazıyorum . İş saatleri aynı gün olabilir, ancak aynı zamanda iki günü de kapsayabilir (örneğin, 15:00 - 01:00 çalışma saatleri).
Drew

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

Bir dizeyi gerçekten bir TimeSpan olarak ayrıştırmak istiyorsanız, o zaman kullanabilirsiniz:

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

teşekkür ederim, saatler sonra denedim 11:57 pmve bu işe yaradı: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
shaijut

16

Bunun için basit bir küçük genişletme işlevi:

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

3
İyi bir ek Andre. Farklı günlük durum için bir VEYA karşılaştırması yapmayı düşünmezdim.
David

4
Harika küçük bir kod parçası ama onunla ilgili bir sorun. Aynı başlangıç ​​ve bitiş saatini belirtirseniz ne olur? Bir varsayım, bunun 24 saatlik bir süreye yayılması gerektiği anlamına gelebileceğidir; bu, kontrollerin start <= enddeğiştirilmesi gerektiği anlamına gelir start < endve başka bir varsayım, aynı gün olduğu olabilir, ancak bu durumda, muhtemelen başarısız olacaktır. Milisaniyeleri içerdiği ve aralık dışı olmasına neden olduğu için Now.TimeOfDay kullanırsınız.
Thierry 18

@Thierry Güzel yakala :) Denemek ve düzeltmek için bekliyoruz.
André Snede Kock

14

Hedefinizi tamamlamak için C # 'da TimeRange nesnesini kullanmayı deneyin.

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

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

TimeRange kullanma örneğini burada buldum


12
TimeRange, herhangi bir C # kitaplığından bir sınıf değildir. Yukarıdaki bağlantıdan indirilebilen harici bir sınıftır.
Jpsy

6

TimeOfDayÖzelliği , bir döner TimeSpandeğeri.

Aşağıdaki kodu deneyin:

TimeSpan time = DateTime.Now.TimeOfDay;

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

Ayrıca, new DateTime()aynıdır DateTime.MinValueve her zaman eşit olacaktır 1/1/0001 12:00:00 AM. (Değer türlerinde boş olmayan varsayılan değerler olamaz) Kullanmak istiyorsunuz DateTime.Now.


2

Çok yakınsınız, sorun şu ki, bir Tarih Saatini bir Günün Saatiyle karşılaştırıyorsunuz. Yapmanız gereken, .TimeOfDay özelliğini Convert.ToDateTime () işlevlerinizin sonuna eklemektir.


2

Bu, gün sınırı durumunu ele almak için daha kolay olacak mı? :)

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 kullanarak bunu basitleştirebiliriz

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

    }
 }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.