Tìm nếu thời gian hiện tại rơi vào một phạm vi thời gian


147

Sử dụng .NET 3.5

Tôi muốn xác định xem thời gian hiện tại có rơi vào phạm vi thời gian không.

Cho đến nay tôi có thời điểm hiện tại:

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

Tôi đang tìm hiểu làm thế nào để có được phạm vi thời gian được chuyển đổi và so sánh. Điều này sẽ làm việc?

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

CẬP NHẬT1: Cảm ơn tất cả mọi người cho đề xuất của bạn. Tôi không quen với chức năng TimeSpan.



3
Bạn có cần phải quan tâm đến việc vượt qua nửa đêm?
gjutras

1
vượt qua nửa đêm không phải là một mối quan tâm nhưng bất cứ điều gì kéo dài nửa đêm chắc chắn sẽ là một lợi ích cho trải nghiệm lập trình của tôi ...
John M

Câu trả lời:


258

Để kiểm tra thời gian sử dụng trong ngày:

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
}

Đối với thời gian tuyệt đối sử dụng:

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
}

Làm thế nào để đếm số lượng trận đấu? Ví dụ tôi muốn đếm có bao nhiêu thứ bảy và chủ nhật trong phạm vi.
sở thích

@pmbiesiada: Điều này hoàn toàn nằm ngoài phạm vi của câu hỏi ban đầu (và câu trả lời). Bạn nên đặt câu hỏi mới này, nhưng hãy thực hiện một câu hỏi ở đây trên SO nếu điều gì đó như thế này đã được trả lời trước đó. Chúc may mắn.
Frank Bollack

1
Nếu có thời gian khác nhau cho những ngày khác nhau thì sao? Có dễ dàng để so sánh điều đó? stackoverflow.com/questions/22769557/
Mạnh

@SearchForKnowledge: So sánh để làm gì? Vui lòng cụ thể hơn về những gì bạn muốn thực hiện hoặc đưa ra một số ví dụ.
Frank Bollack

4
Câu trả lời dưới đây phải là câu được chấp nhận ... Câu hỏi này không kiểm tra TimeSpans qua nhiều ngày, ví dụ: từ 22:00:00 đến 02:00:00 ...
FranzHuber23

117

Một số câu trả lời hay ở đây nhưng không có câu trả lời nào về thời gian bắt đầu của bạn ở một ngày khác với thời gian kết thúc của bạn. Nếu bạn cần phải vượt qua ranh giới ngày, thì những thứ như thế này có thể giúp ích:

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

Lưu ý rằng trong ví dụ này, ranh giới thời gian được bao gồm và điều này vẫn giả định ít hơn chênh lệch 24 giờ giữa startstop.


1
Nếu có thời gian khác nhau cho những ngày khác nhau thì sao? Có dễ dàng để so sánh điều đó? stackoverflow.com/questions/22769557/ cấp
SearchForKnowledge

Điểm tốt, điều đó có ý nghĩa. Nếu thời gian đo được qua nửa đêm thì đây sẽ là câu trả lời duy nhất vẫn đúng.
Sunsetquest 6/03/2015

1
cảm ơn bạn, sau nhiều giờ tôi đã cố gắng 11:57 pmvà điều này đã làm việc: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
shaijut

1
Cảm ơn vì điều đó. Câu trả lời có vẻ đơn giản nhưng thật khó để khái niệm hóa.
Sam tôi đang nói Phục hồi Monica

Đây là một câu trả lời tuyệt vời. Tôi đang viết một phương pháp để xác định xem thời gian của một lần DateTimerơi có trong giờ làm việc được chỉ định hay không. Giờ làm việc có thể trong cùng một ngày, nhưng họ cũng có thể kéo dài hai ngày (ví dụ: 3 giờ chiều - 1 giờ sáng giờ hoạt động).
vẽ

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

nếu bạn thực sự muốn phân tích một chuỗi thành TimeSpan, thì bạn có thể sử dụng:

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

cảm ơn bạn, sau nhiều giờ tôi đã cố gắng 11:57 pmvà điều này đã làm việc: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
shaijut

16

Một chức năng mở rộng nhỏ đơn giản cho việc này:

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
Tốt bổ sung Andre. Sẽ không nghĩ sẽ làm một so sánh HOẶC cho trường hợp ngày khác nhau.
David

3
Một đoạn mã nhỏ tuyệt vời nhưng có một vấn đề với nó. Điều gì nếu bạn chỉ định cùng thời gian bắt đầu và kết thúc. Một giả định là, nó có thể có nghĩa là nó sẽ kéo dài trong khoảng thời gian 24 giờ, điều đó có nghĩa là tình trạng của bạn start <= endsẽ được thay đổi start < endvà một giả định khác có thể là trong cùng một ngày nhưng nếu đó là trường hợp, nó có thể sẽ thất bại nếu bạn sử dụng Now.TimeOfDay vì nó bao gồm mili giây và khiến nó nằm ngoài phạm vi.
Thierry

@Thierry Nice Catch :) Bạn có thể thử và sửa nó.
André Snede Kock

14

Hãy thử sử dụng đối tượng TimeRange trong C # để hoàn thành mục tiêu của bạn.

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

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

Đây là nơi tôi lấy ví dụ về việc sử dụng TimeRange


12
TimeRange không phải là một lớp từ bất kỳ thư viện C # nào. Nó là một lớp bên ngoài có thể được tải xuống tại liên kết ở trên.
Jpsy

6

Tài TimeOfDaysản trả về một TimeSpangiá trị.

Hãy thử đoạn mã sau:

TimeSpan time = DateTime.Now.TimeOfDay;

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

Ngoài ra, new DateTime()là giống như DateTime.MinValuevà sẽ luôn luôn bằng 1/1/0001 12:00:00 AM. (Các loại giá trị không thể có các giá trị mặc định không trống) Bạn muốn sử dụng DateTime.Now.


2

Bạn đang ở rất gần, vấn đề là bạn đang so sánh DateTime với TimeOfDay. Những gì bạn cần làm là thêm thuộc tính .TimeOfDay vào cuối các hàm Convert.ToDateTime () của bạn.


2

Điều này sẽ đơn giản hơn để xử lý trường hợp ranh giới ngày? :)

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

Sử dụng Linq chúng ta có thể đơn giản hóa điều này bằng cách này

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

    }
 }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.