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.