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.