Jak porównać DateTime w C #?

137

Nie chcę, aby użytkownik podawał datę ani godzinę zwrotu.

Jak mogę porównać, czy wprowadzona data i godzina są MNIEJSZE od aktualnego czasu?

Jeśli aktualna data i godzina to 17 czerwca 2010, 12:25, chcę, aby użytkownik nie mógł podać daty przed 17 czerwca -2010 i czasu przed 12:25.

Podobnie jak moja funkcja zwraca false, jeśli czas wprowadzony przez użytkownika to 16 czerwca 2010 i godzina 12:24

Ashish Ashu
źródło

Odpowiedzi:

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
Ahmet Kakıcı
źródło
3
Twoja odpowiedź pozwala zobaczyć, jaka jest różnica, zamiast po prostu wiedzieć, że data jest przed lub po. Oczywiście jego odpowiedź jest lepsza dla OP, ale twoja jest lepsza dla niektórych osób, które dostały się tutaj z Google (wliczając siebie).
levininja
2
Znalazłem odpowiedź cenne, ponieważ patrzę na niektórych starszych kod, gdzie jest on używany
Erik Bergstedt
Tutaj jest łącze MSDN
Harsh Raj
Ale z punktu widzenia debugowania odpowiedź MuSTaNG jest bardziej czytelna.
Himalaya Garg
295

Firma Microsoft wdrożyła również operatory „<” i „>”. Więc używasz ich do porównania dwóch dat.

if (date1 < DateTime.Now)
   Console.WriteLine("Less than the current time!");
Mustang
źródło
6
Źródło MSDN; są one udokumentowane jako operatory daty i czasu niezręcznie oznaczone jako „DateTime.Greater than”, „DateTime.LessThanOrEqualTo” ..... msdn.microsoft.com/en-us/library/ff986512%28v=vs.90%29.aspx
Salman Siddiqui
2
Używam Unity 2017 i używanie tego operatora do sortowania list daje złe wyniki. Próbowałem nawet bezpośrednio porównać DateTime.ticks i to też się nie udało. Musiałem użyć DateTime.CompareTo, aby uzyskać właściwe wyniki i nie wiem dlaczego.
lin
2
To jest źle. To nie może porównać czasu UTC i czasu lokalnego we właściwy sposób.
Altiano Gerung
4
To nie jest pełna odpowiedź. Biorąc pod uwagę DateTime Kind, powinno być albo date1.ToLocalTime() < DateTime.Nowalbo date1.ToUniversalTime() < DateTime.UtcNow.
yurislav
21

Odpowiedź MuSTaNG mówi wszystko, ale wciąż ją dodaję, aby była trochę bardziej rozbudowana, z linkami i wszystkim innym.


Operatory konwencjonalne

są dostępne DateTimeod wersji .NET Framework 1.1. Również dodawanie i odejmowanie DateTimeobiektów jest również możliwe przy użyciu konwencjonalnych operatorów +i -.

Jeden przykład z MSDN:

Równość:
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;

W podobny sposób można używać innych operatorów.

Oto lista wszystkich operatorów dostępnych dla DateTime.

Sнаđошƒаӽ
źródło
1
Możesz po prostu edytować ich odpowiedź, aby ją uszczegółowić. W każdym razie nie możesz użyć +dwóch DateTimeoperandów, Możesz to zrobić DateTime - DateTime, lub DateTime + TimeSpan, lub DateTime - TimeSpan.
Joey
5

W ogólnym przypadku musisz porównać DateTimesz tym samym Kind:

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

Wyjaśnienie z MSDN o DateTime.Compare(Jest to również istotne dla operatorów takich jak >, <, ==itp):

Aby określić związek od t1 do t2, metoda Compare porównuje właściwość Ticks t1 i t2, ale ignoruje ich właściwość Kind . Przed porównaniem obiektów DateTime upewnij się, że obiekty reprezentują godziny w tej samej strefie czasowej.

Dlatego proste porównanie może dać nieoczekiwany wynik, gdy mamy do czynienia z sytuacjami, DateTimesktóre są reprezentowane w różnych strefach czasowych.

AlbertK
źródło
Właśnie miałem błąd z tego powodu ... co myśleli, kiedy stworzyli tę metodę :(
Legolas
3

Jeśli masz dwa DateTime, które wyglądają tak samo, ale Porównaj lub Równe nie zwraca tego, czego oczekujesz, oto jak je porównać.

Oto przykład z dokładnością do 1 milisekundy:

bool areSame = (date1 - date2) > TimeSpan.FromMilliseconds(1d);
yannick triqueneaux
źródło
1
//Time compare.
private int CompareTime(string t1, string t2)
{
    TimeSpan s1 = TimeSpan.Parse(t1);
    TimeSpan s2 = TimeSpan.Parse(t2);
    return s2.CompareTo(s1);
}
Dieu Phan Dinh
źródło
2
On chce porównać DateTimeniestring
Danh
możesz przekonwertować datę i godzinę na ciąg
Dieu Phan Dinh
lub: możesz użyć: DateTime.Compare (startDate, endDate)
Dieu Phan Dinh
To nie mój problem i czy różni się od Ahmeta ?
Danh
0

Oto typowy, prosty przykład w środowisku 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");
    }
}
Fattie
źródło
-3
public static bool CompareDateTimes(this DateTime firstDate, DateTime secondDate) 
{
   return firstDate.Day == secondDate.Day && firstDate.Month == secondDate.Month && firstDate.Year == secondDate.Year;
}
Majid Bajwa
źródło
4
W .NET „Porównaj” zwykle oznacza „porównanie względne”, a nie „sprawdzenie równości”. Pytanie dotyczyło względnego porównania. Dodatkowo nie starałeś się poprawnie sformatować kodu.
Lasse V. Karlsen,