Temukan apakah waktu saat ini jatuh dalam rentang waktu

147

Menggunakan .NET 3.5

Saya ingin menentukan apakah waktu saat ini jatuh dalam rentang waktu.

Sejauh ini saya punya waktu:

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

Saya mengabaikan cara mengubah rentang waktu dan membandingkan. Apakah ini akan berhasil?

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

UPDATE1: Terima kasih semuanya atas saran Anda. Saya tidak terbiasa dengan fungsi TimeSpan.

John M
sumber
3
Apakah Anda perlu khawatir menyeberang tengah malam?
gjutras
1
persimpangan tengah malam tidak menjadi perhatian tapi apa pun yang bentang tengah malam pasti kutukan dari pengalaman pemrograman saya ...
John M

Jawaban:

258

Untuk memeriksa waktu penggunaan sehari:

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
}

Untuk waktu absolut gunakan:

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
}
Frank Bollack
sumber
Bagaimana cara menghitung jumlah pertandingan? Misalnya saya ingin menghitung berapa hari Sabtu dan minggu dalam kisaran.
pai
@pmbiesiada: Ini sepenuhnya di luar ruang lingkup pertanyaan asli (dan jawabannya). Anda harus membuat ini pertanyaan baru, tetapi lakukan serach di sini pada SO jika sesuatu seperti ini telah dijawab sebelumnya. Semoga berhasil.
Frank Bollack
1
Bagaimana jika ada waktu yang berbeda untuk hari yang berbeda? Apakah ada yang mudah untuk membandingkannya? stackoverflow.com/questions/22769557/…
SearchForKnowledge
@SearchForKnowledge: Bandingkan untuk apa? Harap lebih spesifik tentang apa yang ingin Anda capai atau berikan beberapa contoh.
Frank Bollack
4
Jawaban di bawah ini harus yang diterima ... Yang ini tidak memeriksa TimeSpans selama berhari-hari, misalnya dari 22:00:00 hingga 02:00:00 ...
FranzHuber23
118

Beberapa jawaban yang baik di sini tetapi tidak ada yang mencakup kasus waktu mulai Anda berada di hari yang berbeda dari waktu akhir Anda. Jika Anda perlu melewati batas hari, maka sesuatu seperti ini dapat membantu:

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

Perhatikan bahwa dalam contoh ini batas waktu inklusif dan bahwa ini masih mengasumsikan perbedaan kurang dari 24 jam antara startdan stop.

Nick
sumber
1
Bagaimana jika ada waktu yang berbeda untuk hari yang berbeda? Apakah ada yang mudah untuk membandingkannya? stackoverflow.com/questions/22769557/…
SearchForKnowledge
Poin bagus, itu masuk akal. Jika waktu yang diukur melewati tengah malam maka ini akan menjadi satu-satunya jawaban yang masih benar.
Sunsetquest
1
terima kasih, setelah berjam-jam saya coba 11:57 pmdan ini berhasil: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
shaijut
1
Terima kasih untuk itu. Jawabannya tampaknya sederhana, tetapi agak canggung untuk dikonsep.
Sam saya berkata Reinstate Monica
Ini jawaban yang bagus. Saya menulis metode untuk menentukan apakah waktu yang diberikan DateTimejatuh dalam jam kerja yang ditentukan. Jam kerja bisa pada hari yang sama, tetapi mereka juga bisa span dua hari (misalnya, jam 3 sore - 1 jam operasional).
Drew
17
if (new TimeSpan(11,59,0) <= currentTime.TimeOfDay && new TimeSpan(13,01,0) >=  currentTime.TimeOfDay)
{
   //match found
}

jika Anda benar-benar ingin mengurai string ke dalam TimeSpan, maka Anda dapat menggunakan:

    TimeSpan start = TimeSpan.Parse("11:59");
    TimeSpan end = TimeSpan.Parse("13:01");
JDunkerley
sumber
terima kasih, setelah berjam-jam saya coba 11:57 pmdan ini berhasil: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
shaijut
16

Sedikit fungsi ekstensi sederhana untuk ini:

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;
}
André Snede Kock
sumber
3
Andre yang bagus. Tidak akan berpikir untuk melakukan perbandingan ATAU untuk kasus hari yang berbeda.
David
3
Sepotong kecil kode hebat tapi satu masalah dengan itu. Bagaimana jika Anda menentukan waktu mulai dan berakhir yang sama. Satu asumsi adalah bahwa, itu mungkin berarti harus mencakup periode lebih dari 24 jam yang berarti kondisi Anda di mana pemeriksaan start <= endharus diubah start < enddan asumsi lain mungkin bahwa itu pada hari yang sama tetapi jika ini masalahnya, kemungkinan akan gagal jika Anda menggunakan Now.TimeOfDay karena termasuk milidetik dan menyebabkan berada di luar jangkauan.
Thierry
@Thierry Nice catch :) Anda dipersilakan untuk mencoba dan memperbaikinya.
André Snede Kock
14

Coba gunakan objek TimeRange di C # untuk menyelesaikan tujuan Anda.

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

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

Di sinilah saya mendapatkan contoh menggunakan TimeRange

stewsha
sumber
12
TimeRange bukan kelas dari pustaka C # mana pun. Ini adalah kelas eksternal yang dapat diunduh di tautan di atas.
Jpsy
6

The TimeOfDayproperti mengembalikan TimeSpannilai.

Coba kode berikut:

TimeSpan time = DateTime.Now.TimeOfDay;

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

Juga, new DateTime()sama dengan DateTime.MinValuedan akan selalu sama dengan 1/1/0001 12:00:00 AM. (Jenis nilai tidak dapat memiliki nilai default yang tidak kosong) Anda ingin menggunakan DateTime.Now.

Slaks
sumber
2

Anda sangat dekat, masalahnya adalah Anda membandingkan DateTime dengan TimeOfDay. Yang perlu Anda lakukan adalah menambahkan properti .TimeOfDay ke akhir fungsi Convert.ToDateTime () Anda.

Michael La Voie
sumber
2

Apakah ini akan lebih mudah untuk menangani kasus batas hari? :)

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 ... 
}
Elliott
sumber
0

Menggunakan Linq kita bisa menyederhanakan ini dengan ini

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

    }
 }
Patel Vishal
sumber