ค้นหาว่าเวลาปัจจุบันตกอยู่ในช่วงเวลาหรือไม่


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
ข้ามเที่ยงคืนไม่ได้เป็นกังวล แต่สิ่งที่ช่วงเที่ยงคืนเป็นแน่ใจว่าสารพิษของประสบการณ์การเขียนโปรแกรมของฉัน ...
จอห์นเอ็ม

คำตอบ:


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
}

จะนับจำนวนแมตช์ได้อย่างไร? ตัวอย่างเช่นฉันต้องการนับจำนวนวันเสาร์และอาทิตย์ในช่วง
pbies

@pmbiesiada: นี่ไม่ใช่ขอบเขตของคำถามเดิมทั้งหมด (และคำตอบ) คุณควรทำให้เป็นคำถามใหม่ แต่ทำ serach ที่นี่ใน SO หากสิ่งนี้ได้รับการตอบก่อน โชคดี.
Frank Bollack

1
เกิดอะไรขึ้นถ้ามีเวลาต่างกันสำหรับวันที่แตกต่างกัน มีวิธีเปรียบเทียบที่ง่ายไหม? stackoverflow.com/questions/22769557/…
SearchForKnowledge

@SearchForKnowledge: เปรียบเทียบกับอะไร โปรดเจาะจงมากขึ้นเกี่ยวกับสิ่งที่คุณต้องการจะทำหรือให้ตัวอย่าง
Frank Bollack

4
คำตอบด้านล่างควรเป็นคำตอบที่ได้รับการยอมรับ ... อันนี้ไม่ได้ตรวจสอบ TimeSpans ในช่วงวันเช่น 22:00 น. ถึง 02:00:00 น. ...
FranzHuber23

118

บางคำตอบที่ดีที่นี่ แต่ไม่มีใครครอบคลุมกรณีที่เวลาเริ่มต้นของคุณอยู่ในวันที่แตกต่างจากเวลาสิ้นสุดของคุณ หากคุณจำเป็นต้องก้าวข้ามขอบเขตของวันแล้วบางสิ่งเช่นนี้อาจช่วย:

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 ชั่วโมงระหว่างและstartstop


1
เกิดอะไรขึ้นถ้ามีเวลาต่างกันสำหรับวันที่แตกต่างกัน มีวิธีเปรียบเทียบที่ง่ายไหม? stackoverflow.com/questions/22769557/…
SearchForKnowledge

จุดที่ดีที่ทำให้รู้สึก หากเวลาที่วัดผ่านเที่ยงคืนนี่เป็นคำตอบเดียวที่จะยังคงถูกต้อง
Sunsetquest

1
ขอบคุณหลังจากเวลาผ่านไปหลายชั่วโมงฉันพยายามทำ11:57 pmสิ่งนี้แล้ว: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
shaijut

1
ขอบคุณสำหรับสิ่งนั้น. คำตอบนั้นดูง่ายมาก แต่ก็ค่อนข้างแปลกที่จะสร้างแนวคิด
แซมฉันว่า Reinstate Monica

นี่คือคำตอบที่ดี ฉันกำลังเขียนวิธีการเพื่อตรวจสอบว่าเวลาของการกำหนดDateTimeอยู่ภายในเวลาทำการที่ระบุ เวลาทำการอาจเป็นในวันเดียวกัน แต่อาจขยายได้สองวัน (เช่น 15:00 - 01:00 น.)
ดึง

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
นอกจากนี้ที่ดีอังเดร คงไม่คิดว่าจะทำการเปรียบเทียบหรือสำหรับกรณีวันที่แตกต่างกัน
เดวิด

3
มีโค้ดน้อยมาก แต่มีปัญหาอย่างหนึ่ง จะทำอย่างไรถ้าคุณระบุเวลาเริ่มต้นและสิ้นสุดที่เหมือนกัน ข้อสันนิษฐานข้อหนึ่งก็คือมันอาจหมายถึงว่ามันควรขยายเป็นระยะเวลา 24 ชั่วโมงซึ่งหมายความว่าสภาพของคุณที่การตรวจสอบstart <= endควรเปลี่ยนไปstart < endและข้อสันนิษฐานอื่นอาจเป็นในวันเดียวกัน แต่ถ้าเป็นกรณีนี้มันอาจจะล้มเหลวถ้า คุณใช้ Now.TimeOfDay เนื่องจากมีมิลลิวินาทีและทำให้อยู่นอกช่วง
ธีรี่

@ Thierry จับดี :) คุณสามารถลองและแก้ไขได้
André Snede Kock

14

ลองใช้วัตถุ TimeRange ใน C # เพื่อทำเป้าหมายให้สำเร็จ

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 สิ่งที่คุณต้องทำคือการเพิ่มคุณสมบัติ. TimeOfDay ที่ส่วนท้ายของฟังก์ชัน Convert.ToDateTime () ของคุณ


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.