2009-03-25 28 views
18

Dường như có một số cách có thể để xác định xem System.DateTime cụ thể có biểu thị nửa đêm hay không. Những ưu và nhược điểm của mỗi cái là gì? Là một trong những dễ đọc hơn hoặc thực hiện tốt hơn so với những người khác?Cách tốt nhất để xác định xem System.DateTime là nửa đêm?

EDIT: Tôi tin rằng khả năng đọc quan trọng hơn hiệu suất cho đến khi tiểu sử hiển thị rằng có sự cố. Đó là lý do tại sao tôi hỏi về cả hai.

Ví dụ 1

Public Function IsMidnight(ByVal value As Date) As Boolean 
    Return value.TimeOfDay = TimeSpan.FromHours(0) 
End Function 

Ví dụ 2

Public Function IsMidnight(ByVal value As Date) As Boolean 
    Return value.CompareTo(value.[Date]) = 0 
End Function 
+0

ví dụ của tôi là trong VB.NET vì đó là những gì Tôi hiện đang sử dụng chuyên nghiệp. Tuy nhiên, câu hỏi này được áp dụng cho tất cả các ngôn ngữ trong Khuôn khổ .NET. –

+0

Đối với những người tò mò về việc sử dụng, tôi đang kiểm tra ngày giờ được nhập bởi các trường ngày so với những ngày được nhập theo trường thời gian ngày. –

Trả lời

37

Tôi muốn kiểm tra (sử dụng C# cho ví dụ):

bool isMidnight = value.TimeOfDay.Ticks == 0; 

IMO, điều này là dễ dàng hơn so với sử dụng FromHours vv, và không liên quan đến bất kỳ nhân thêm (vì Ticksđịnh nghĩa các TimeSpan - tất cả các thuộc tính khác được tính toán).

+0

Tôi nghĩ rằng việc đo ve sẽ khó có thể đánh giá đúng. Thực hiện một vài báo cáo sẽ liên quan đến một vài ticks.Might được dễ dàng hơn để kiểm tra phút. – Cerebrus

+4

Nó sẽ đánh giá đúng cho tất cả các lần đại diện cho * true * nửa đêm. Bạn sẽ không gọi nó trên 'DateTime.Now', rõ ràng, nhưng nó thực hiện công việc như đã nêu ... –

+1

Quan trọng hơn, nó khớp chính xác với" Return value.TimeOfDay = TimeSpan.FromHours (0) "từ câu hỏi gốc . Kiểm tra phút vv ** không ** –

5

Phụ thuộc. Bạn có muốn kiểm tra chính xác nửa đêm đến giây hay chỉ là nửa đêm?

Đối với giờ nửa đêm

Public Function IsMidnightHour(ByVal date as Date) As Boolean 
    return date.Hour = 0 
End Function 

Đối với giờ nửa đêm và phút

Public Function IsMidnightHourAndMinute(ByVal date as Date) As Boolean 
    return date.Hour = 0 AndAlso date.Minute = 0 
End Function 

Đối hoàn toàn đơn giản, chính xác lúc nửa đêm, bạn có thể sử dụng ví dụ của bạn. Tuy nhiên điều đó sẽ bao gồm kiểm tra lên đến mili giây mà có thể không phải là những gì bạn muốn.

+0

Tôi đang tìm chính xác nửa đêm đến mili giây. –

+0

@Eric, sau đó câu trả lời của Marc là cách hiệu quả nhất. – JaredPar

7

Đây là một chút tối ưu hóa vi mô, một trong hai phương pháp sẽ hoạt động tốt.

Nhưng dù sao, tôi nghĩ rằng đây là những gì sẽ thực hiện tốt nhất:

Public Function IsMidnight(ByVal value As Date) As Boolean 
    Return value.TimeOfDay.Ticks = 0 
End Function 

Nếu bạn muốn mã dễ hiểu, có lẽ đây là tốt nhất:

Public Function IsMidnight(ByVal value As Date) As Boolean 
    Return value.TimeOfDay = TimeSpan.Zero 
End Function 
+0

Thực ra, những người đó nên thực hiện nhiều hơn hoặc ít hơn như nhau, vì Ticks được sử dụng như một giá trị nội bộ trong TimeSpan. Vì vậy, (timespan == timespan) là nhiều hơn hoặc ít hơn giống như (timespan.ticks == timespan.ticks) mà trong cả hai trường hợp sẽ là (timespan.ticks == 0) –

+0

Có, toán tử == được thực hiện để so sánh Thuộc tính Ticks, vì vậy TimeSpan.Zero.Ticks chỉ là một con đường dài hơn để có được bằng không. :) – Guffa

Các vấn đề liên quan