Come confrontare DateTime in C #?


137

Non voglio che l'utente fornisca la data o l'ora di ritorno.

Come posso confrontare se la data e l'ora inserite sono MENO rispetto all'ora corrente?

Se la data e l'ora correnti sono 17-giu-2010, 12:25, desidero che l'utente non possa indicare la data prima del 17 giugno -2010 e l'ora prima delle 12:25 PM.

Come la mia funzione, restituire false se l'ora immessa dall'utente è il 16-giu-2010 e l'ora alle 12:24 PM

Risposte:


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
La tua risposta fornisce un modo per vedere qual è la differenza invece di sapere semplicemente che la data è precedente o successiva. Ovviamente la sua risposta è migliore per l'OP, ma la tua è migliore per alcune persone che sono arrivate qui da Google (auto-incluse).
levininja,

2
Ho trovato preziosa la tua risposta perché sto esaminando un codice legacy in cui viene utilizzato
Erik Bergstedt,


Ma dal punto di vista del debug, la risposta di MuSTaNG è più leggibile.
Himalaya Garg,

295

Microsoft ha anche implementato gli operatori '<' e '>'. Quindi li usi per confrontare due date.

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

6
MSDN di origine; questi sono documentati come Operatori DateTime etichettati goffamente come "DateTime.Greater than", "DateTime.LessThanOrEqualTo" ..... msdn.microsoft.com/en-us/library/ff986512%28v=vs.90%29.aspx
Salman Siddiqui il


2
Sto usando Unity 2017 e questo operatore per ordinare gli elenchi mi dà risultati sbagliati. Ho anche provato a confrontare direttamente DateTime.ticks e anche questo non è riuscito. Ho dovuto usare DateTime.CompareTo per arrivare ai risultati giusti e non so perché.
lin

2
Questo è sbagliato. Questo non può confrontare UTC e l'ora locale nel modo giusto.
Altiano Gerung,

4
Questa non è una risposta completa. Quando si prende DateTime Kind a ocnsideration, dovrebbe essere date1.ToLocalTime() < DateTime.Nowo date1.ToUniversalTime() < DateTime.UtcNow.
yurislav,

21

La risposta di MuSTaNG dice tutto, ma lo sto ancora aggiungendo per renderlo un po 'più elaborato, con collegamenti e tutto.


Gli operatori convenzionali

sono disponibili per DateTime.NET Framework 1.1. Inoltre, l'aggiunta e la sottrazione di DateTimeoggetti sono anche possibili usando operatori convenzionali +e- .

Un esempio da MSDN:

Uguaglianza:
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;

Anche altri operatori possono essere usati.

Ecco l'elenco per cui tutti gli operatori sono disponibili DateTime.


1
Potresti semplicemente modificare la loro risposta per elaborare. In ogni caso, non puoi usare +per due DateTimeoperandi, Puoi fare DateTime - DateTime, o DateTime + TimeSpan, o DateTime - TimeSpan.
Joey,

5

In generale, è necessario confrontare DateTimescon lo stesso Kind:

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

Spiegazione da MSDN circa DateTime.Compare(Questo è rilevante per gli operatori, come anche >, <, ==e così via):

Per determinare la relazione tra t1 e t2, il metodo Compare confronta la proprietà Ticks di t1 e t2 ma ignora la loro proprietà Kind . Prima di confrontare gli oggetti DateTime, assicurarsi che gli oggetti rappresentino gli orari nello stesso fuso orario.

Pertanto, un semplice confronto può dare un risultato inaspettato quando si ha a DateTimesche fare con che sono rappresentati in diversi fusi orari.


Ho appena avuto un bug a causa di questo ... a cosa stavano pensando quando hanno fatto quel metodo :(
Legolas,

3

Se hai due DateTime che sembrano uguali, ma Confronta o Uguali non restituiscono ciò che ti aspetti, ecco come confrontarli.

Ecco un esempio con precisione di 1 millisecondo:

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
Egli vuole confrontare DateTimenonstring
Danh

puoi convertire il datetime in stringa
Dieu Phan Dinh

oppure: è possibile utilizzare: DateTime.Compare (startDate, endDate)
Dieu Phan Dinh

Non è un mio problema ed è diverso da quello di Ahmet ?
Danh,

0

Ecco un semplice esempio tipico nell'ambiente 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
In .NET, "Confronta" di solito significa "confronto relativo" e non "controllo dell'uguaglianza". La domanda qui era sul confronto relativo. Inoltre, non hai fatto nessuno sforzo per formattare correttamente il codice.
Lasse V. Karlsen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.