Làm cách nào để so sánh DateTime trong C #?


137

Tôi không muốn người dùng cung cấp ngày trở lại.

Làm cách nào để so sánh nếu ngày và giờ đã nhập là ÍT thì thời gian hiện tại?

Nếu ngày và giờ hiện tại là 17 tháng 6 năm 2010, 12:25 chiều, tôi muốn người dùng không thể đưa ra ngày trước ngày 17 tháng 6 năm 2010 và thời gian trước 12:25 chiều.

Giống như chức năng của tôi trả về sai nếu thời gian người dùng nhập vào là 16 tháng 6 năm 2010 và thời gian 12:24 chiều

Câu trả lời:


179

MSDN: DateTime.Compare

DateTime date1 = new DateTime(2009, 8, 1, 0, 0, 0);
DateTime date2 = new DateTime(2009, 8, 1, 12, 0, 0);
int result = DateTime.Compare(date1, date2);
string relationship;

if (result < 0)
   relationship = "is earlier than";
else if (result == 0)
   relationship = "is the same time as";         
else
   relationship = "is later than";

Console.WriteLine("{0} {1} {2}", date1, relationship, date2);
// The example displays the following output:
//    8/1/2009 12:00:00 AM is earlier than 8/1/2009 12:00:00 PM

3
Câu trả lời của bạn cung cấp một cách để xem sự khác biệt là gì thay vì chỉ biết rằng ngày đó là trước hoặc sau. Tất nhiên câu trả lời của anh ấy tốt hơn cho OP, nhưng câu trả lời của bạn tốt hơn cho một số người đã đến đây từ google (bao gồm cả bản thân).
levininja

2
Tôi thấy câu trả lời của bạn có giá trị vì tôi đang xem một số mã kế thừa được sử dụng
Erik Bergstedt


Nhưng từ quan điểm gỡ lỗi, câu trả lời của MuSTaNG dễ đọc hơn.
Himalaya Garg

295

Microsoft cũng đã triển khai các toán tử '<' và '>'. Vì vậy, bạn sử dụng chúng để so sánh hai ngày.

if (date1 < DateTime.Now)
   Console.WriteLine("Less than the current time!");

6
Nguồn MSDN; những thứ này được ghi nhận là các nhà khai thác DateTime lúng túng được gắn nhãn là "DateTime.GTHER than", "DateTime.LessThanOrEqualTo" ..... msdn.microsoft.com/en-us/l
Salman Siddiqui


2
Tôi đang sử dụng Unity 2017 và sử dụng toán tử này để sắp xếp danh sách cho tôi kết quả sai. Tôi thậm chí đã cố gắng so sánh trực tiếp DateTime.ticks và điều đó cũng thất bại. Tôi đã phải sử dụng DateTime.CompareTo để đi đến kết quả đúng và tôi không biết tại sao.
lin

2
Cái này sai. Điều này không thể so sánh UTC và Giờ địa phương theo đúng cách.
Altiano Gerung

4
Đây không phải là câu trả lời đầy đủ. Khi sử dụng DateTime Kind để ocnsideration, nó sẽ là date1.ToLocalTime() < DateTime.Nowhoặc date1.ToUniversalTime() < DateTime.UtcNow.
yurislav

21

Câu trả lời của MuSTaNG đã nói lên tất cả, nhưng tôi vẫn đang thêm nó để làm cho nó phức tạp hơn một chút, với các liên kết và tất cả.


Các toán tử thông thường

có sẵn DateTimekể từ .NET Framework 1.1. Ngoài ra, cộng và trừ các DateTimeđối tượng cũng có thể sử dụng các toán tử thông thường +-.

Một ví dụ từ MSDN:

Bình đẳng:
System.DateTime april19 = new DateTime(2001, 4, 19);
System.DateTime otherDate = new DateTime(1991, 6, 5);

// areEqual gets false.
bool areEqual = april19 == otherDate;

otherDate = new DateTime(2001, 4, 19);
// areEqual gets true.
areEqual = april19 == otherDate;

Các toán tử khác có thể được sử dụng tương tự.

Dưới đây là danh sách tất cả các nhà khai thác có sẵn cho DateTime.


1
Bạn chỉ có thể chỉnh sửa câu trả lời của họ để giải thích. Trong mọi trường hợp, bạn không thể sử dụng +cho hai DateTimetoán hạng, Bạn có thể làm DateTime - DateTimehoặc DateTime + TimeSpanhoặc DateTime - TimeSpan.
Joey

5

Trong trường hợp chung, bạn cần so sánh DateTimesvới cùng Kind:

if (date1.ToUniversalTime() < date2.ToUniversalTime())
    Console.WriteLine("date1 is earlier than date2");

Giải thích từ MSDN về DateTime.Compare(Điều này cũng phù hợp cho các nhà khai thác như >, <, ==và vv):

Để xác định mối quan hệ của t1 với t2, phương thức So sánh so sánh thuộc tính Ticks của t1 và t2 nhưng bỏ qua thuộc tính Kind của chúng . Trước khi so sánh các đối tượng DateTime, đảm bảo rằng các đối tượng biểu thị thời gian trong cùng múi giờ.

Do đó, một so sánh đơn giản có thể cho kết quả bất ngờ khi xử lý DateTimesđược biểu diễn theo các múi giờ khác nhau.


Chỉ có một lỗi vì điều này ... họ đã nghĩ khi họ thực hiện phương pháp đó :(
Legolas

2

Nếu bạn có hai DateTime trông giống nhau, nhưng So sánh hoặc Bằng không trả lại những gì bạn mong đợi, đây là cách so sánh chúng.

Dưới đây là một ví dụ với độ chính xác 1 mili giây:

bool areSame = (date1 - date2) > TimeSpan.FromMilliseconds(1d);

1
//Time compare.
private int CompareTime(string t1, string t2)
{
    TimeSpan s1 = TimeSpan.Parse(t1);
    TimeSpan s2 = TimeSpan.Parse(t2);
    return s2.CompareTo(s1);
}

2
Anh muốn so sánh DateTimekhôngstring
Danh

bạn có thể chuyển đổi datetime thành chuỗi
Dieu Phan Dinh

hoặc: bạn có thể sử dụng: DateTime.Compare (startDate, endDate)
Dieu Phan Dinh

Không phải vấn đề của tôi và nó có khác với Ahmet không?
Danh

0

Đây là một ví dụ đơn giản điển hình trong môi trường Unity

using UnityEngine;

public class Launch : MonoBehaviour
{
    void Start()
    {
        Debug.Log("today " + System.DateTime.Now.ToString("MM/dd/yyyy"));

        // don't allow the app to be run after June 10th
        System.DateTime lastDay = new System.DateTime(2020, 6, 10);
        System.DateTime today = System.DateTime.Now;

        if (lastDay < today) {
            Debug.Log("quit the app");
            Application.Quit();
        }
        UnityEngine.SceneManagement.SceneManager.LoadScene("Welcome");
    }
}

-3
public static bool CompareDateTimes(this DateTime firstDate, DateTime secondDate) 
{
   return firstDate.Day == secondDate.Day && firstDate.Month == secondDate.Month && firstDate.Year == secondDate.Year;
}

4
Trong .NET, "So sánh" thường có nghĩa là "so sánh tương đối" chứ không phải "kiểm tra bình đẳng". Câu hỏi ở đây là về so sánh tương đối. Ngoài ra, bạn không nỗ lực để định dạng mã đúng.
Lasse V. Karlsen
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.