Làm cách nào để kiểm tra xem DateTime có xảy ra hôm nay không?


110

Có cách .net nào tốt hơn để kiểm tra xem DateTime có xảy ra 'hôm nay' hay không, sau đó là mã bên dưới?

if ( newsStory.WhenAdded.Day == DateTime.Now.Day &&
     newsStory.WhenAdded.Month == DateTime.Now.Month &&
     newsStory.WhenAdded.Year == DateTime.Now.Year )
{ 
    // Story happened today
}
else
{ 
    // Story didn't happen today
}

14
Bạn có thể so sánh newStory.Date == DateTime.Now.Date
Guillaume

Câu trả lời:


222
if (newsStory.WhenAdded.Date == DateTime.Today)
{

}
else
{

}

Nên làm thủ thuật.


3
... nếu newsStory.Date thực sự chỉ là phần ngày, không có thời gian. ;)
Lucero

14
... mà nó là, nếu newsStory là một DateTime
stevemegson

18
Vâng, DateTime là một phần của Thư viện lớp .NET Framework, vì vậy mặc dù có thể OP đã tạo lớp riêng của mình mà tình cờ có chung tên, bạn sẽ phải tự hỏi tại sao anh ta lại hỏi StackOverflow cách sử dụng lớp tùy chỉnh anh ấy đã tạo ra và mong đợi chúng ta biết cách nó hoạt động một cách kỳ diệu. ;)
Brian Schroth

2
@Lucero điều đó có thể xảy ra, tuy nhiên tiêu đề câu hỏi ghi là 'hai DateTimes'. ;) Tôi đoán đó là nơi chúng tôi lấy loại bị thiếu đó từ.
pyrocumulus

1
@HansPetterNaumann đó là hợp lý :) DateTime.AddHours () trả về một đối tượng DateTime mới, do đó hủy hiệu quả hoạt động .Today của bạn thực sự không có thành phần thời gian.
pyrocumulus

29
if( newsStory.Date == DateTime.Today )
{
    // happened today
}

5
Tôi muốn nói thêm, đó là một lỗi rất phổ biến (và khó phát hiện) - chỉ cần so sánh DateTime với DateTime.Today.
JL.

16

Thử

if (newsStory.Date == DateTime.Now.Date) 
{ /* Story happened today */ }
else
{ /* Story didn't happen today */ }

14

Giải pháp của tôi:

private bool IsTheSameDay(DateTime date1, DateTime date2)
{
    return (date1.Year == date2.Year && date1.DayOfYear == date2.DayOfYear);
}

7

Nếu NewsStory cũng đang sử dụng DateTime, chỉ cần so sánh thuộc tính Date và bạn đã hoàn tất.

Tuy nhiên, điều này phụ thuộc vào ý nghĩa thực sự của "ngày hôm nay". Nếu một cái gì đó được đăng ngay trước nửa đêm, nó sẽ "cũ" sau một thời gian ngắn. Vì vậy, có lẽ tốt nhất là bạn nên giữ chính xác ngày tháng của câu chuyện (bao gồm cả thời gian, tốt nhất là UTC) và kiểm tra xem đã trôi qua chưa đầy 24 giờ (hoặc bất cứ điều gì), điều này rất đơn giản (có thể trừ ngày tháng, điều này mang lại cho bạn Khoảng thời gian bằng Tổng số giờ hoặc thuộc tính TotalDays).


5

Bạn có thể triển khai phương thức mở rộng DateTime.

Tạo lớp mới cho các phương thức mở rộng của bạn:

namespace ExtensionMethods
{
    public static class ExtensionMethods
    {
        public static bool IsSameDay( this DateTime datetime1, DateTime datetime2 )
        {
            return datetime1.Year == datetime2.Year 
                && datetime1.Month == datetime2.Month 
                && datetime1.Day == datetime2.Day;
        }
    }
}

Và bây giờ, ở mọi nơi trên mã của bạn, nơi bạn muốn thực hiện kiểm tra này, bạn nên bao gồm việc sử dụng:

using ExtensionMethods;

Và sau đó, sử dụng phương thức mở rộng:

newsStory.WhenAdded.IsSameDay(DateTime.Now);

3
tại sao không chỉ trả về datetime1.Date == datetime2.Date?
Sergiu Mindras

@SergiuMindras nói đúng, so sánh cả hai là đủ Datevì nó TimeSpansẽ luôn là 00:00:00.
GoRoS

5

FYI,

newsStory.Date == DateTime.Today

sẽ trả về cùng một kết quả so sánh như mã hóa

newsStory == DateTime.Today

nơi newsStorylà một DateTimeđối tượng

.NET đủ thông minh để xác định bạn muốn so sánh chỉ dựa trên Ngày và sử dụng nó cho So sánh nội bộ. Không chắc tại sao và thực sự gặp khó khăn khi tìm tài liệu cho hành vi này.




1

tốt, DateTime có thuộc tính "Ngày" và bạn chỉ có thể so sánh dựa trên đó. Nhưng nhìn vào các tài liệu, có vẻ như việc lấy thuộc tính đó thực sự khởi tạo một ngày giờ mới với thành phần thời gian được đặt thành nửa đêm, vì vậy nó rất có thể chậm hơn so với việc truy cập từng thành phần riêng lẻ, mặc dù sạch hơn và dễ đọc hơn nhiều.


Tôi nghĩ rằng sự chậm lại (nếu tồn tại) sẽ rất nhỏ, nó không quan trọng trong hầu hết các trường hợp. Chắc chắn là một trường hợp tối ưu hóa quá sớm.
Esben Skov Pedersen 22/10/09

Đồng ý - ngày nay tôi thấy ngày càng khó để loại bỏ tối ưu hóa quá sớm vì thế giới mã hóa hiện đại thiên về tính dễ đọc và khả năng bảo trì. Thói quen cũ khó thay đổi!
Peter Bridger

0

if (newsStory.ToShortDateString() == DateTime.Today.ToShortDateString()) return "Todtay";


-4

Làm thế nào về

if (newsStory.DayOfYear == DateTime.Now.DayOfYear)
{ // Story happened today
}

Nhưng điều này cũng sẽ trở lại đúng cho ngày 1 tháng 1 năm 2008 và ngày 1 tháng 1 năm 2009, có thể là điều bạn muốn hoặc không.


-6

bạn đã có thể sử dụng DateTime.Now.DayOfYear

 if (newsStory.DayOfYear == DateTime.Now.DayOfYear)
 { // story happened today

 }
 else
 { // story didn't happen today

 }

1
Tôi không nghĩ rằng điều này sẽ hiệu quả. Nếu hôm nay là 21/10/2009 và newsStory là 21/10/2008 - thì nó sẽ trả về true (tôi không tính đến năm nhuận ở đây).
Philip Wallace

2
Điều này sẽ không phân biệt giữa các năm DateTime mới (2009, 10, 01) .DayOfYear == new DateTime (1900, 10, 01) .DayOfYear;
Dave D
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.