Comment comparer DateTime en C #?


137

Je ne veux pas que l'utilisateur donne la date ou l'heure de retour.

Comment puis-je comparer si la date et l'heure entrées sont INFÉRIEURES à l'heure actuelle?

Si la date et l'heure actuelles sont le 17 juin 2010, 12 h 25, je souhaite que l'utilisateur ne puisse pas indiquer la date avant le 17 juin 2010 et l'heure avant 12 h 25.

Comme ma fonction renvoie false si l'heure entrée par l'utilisateur est le 16 juin 2010 et l'heure 12 h 24

Réponses:


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
Votre réponse fournit un moyen de voir quelle est la différence au lieu de simplement savoir que la date est avant ou après. Bien sûr, sa réponse est meilleure pour l'OP, mais la vôtre est meilleure pour certaines personnes qui sont arrivées ici depuis Google (y compris moi-même).
levininja

2
J'ai trouvé votre réponse précieuse car je regarde un code hérité où cela est utilisé
Erik Bergstedt

Voici le lien MSDN
Harsh Raj

Mais du point de vue du débogage, la réponse de MuSTaNG est plus lisible.
Himalaya Garg

295

Microsoft a également implémenté les opérateurs «<» et «>». Vous les utilisez donc pour comparer deux dates.

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

6
MSDN source; ceux-ci sont documentés en tant qu'opérateurs DateTime étiquetés maladroitement comme "DateTime.Greater than", "DateTime.LessThanOrEqualTo" ..... msdn.microsoft.com/en-us/library/ff986512%28v=vs.90%29.aspx
Salman Siddiqui


2
J'utilise Unity 2017 et l'utilisation de cet opérateur pour trier les listes me donne des résultats erronés. J'ai même essayé de comparer directement DateTime.ticks et cela a également échoué. J'ai dû utiliser DateTime.CompareTo pour arriver à de bons résultats et je ne sais pas pourquoi.
lin

2
C'est faux. Cela ne peut pas comparer l'UTC et l'heure locale de la bonne manière.
Altiano Gerung

4
Ce n'est pas une réponse complète. Lors de la prise en compte de DateTime Kind, il doit être soit date1.ToLocalTime() < DateTime.Nowou date1.ToUniversalTime() < DateTime.UtcNow.
yurislav le

21

La réponse de MuSTaNG dit tout, mais je l'ajoute toujours pour la rendre un peu plus élaborée, avec des liens et tout.


Les opérateurs conventionnels

sont disponibles DateTimedepuis .NET Framework 1.1. En outre, l'addition et la soustraction d' DateTimeobjets sont également possibles en utilisant les opérateurs conventionnels +et -.

Un exemple de MSDN:

Égalité:
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;

D'autres opérateurs peuvent également être utilisés.

Voici la liste de tous les opérateurs disponibles pour DateTime.


1
Vous pouvez simplement modifier leur réponse pour élaborer. Dans tous les cas, vous ne pouvez pas utiliser +pour deux DateTimeopérandes, Vous pouvez faire DateTime - DateTime, ou DateTime + TimeSpan, ou DateTime - TimeSpan.
Joey

5

Dans le cas général, vous devez comparer DateTimesavec le même Kind:

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

Explication de MSDN à propos de DateTime.Compare(Ceci est également important pour les opérateurs comme >, <, ==et etc.):

Pour déterminer la relation entre t1 et t2, la méthode Compare compare la propriété Ticks de t1 et t2 mais ignore leur propriété Kind . Avant de comparer des objets DateTime, assurez-vous que les objets représentent des heures dans le même fuseau horaire.

Ainsi, une simple comparaison peut donner un résultat inattendu lorsqu'il s'agit de ce DateTimesqui est représenté dans différents fuseaux horaires.


J'ai juste eu un bug à cause de cela ... à quoi pensaient-ils quand ils ont fait cette méthode :(
Legolas

3

Si vous avez deux DateTime qui se ressemblent, mais que Compare ou Equals ne renvoie pas ce que vous attendez, voici comment les comparer.

Voici un exemple avec une précision de 1 milliseconde:

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
Il veut comparer DateTimenonstring
Danh

vous pouvez convertir datetime en chaîne
Dieu Phan Dinh

ou: vous pouvez utiliser: DateTime.Compare (startDate, endDate)
Dieu Phan Dinh

Ce n'est pas mon problème et est-ce différent de celui d' Ahmet ?
Danh

0

Voici un exemple simple typique dans le milieu 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
Dans .NET, «Comparer» signifie généralement «comparaison relative» et non «vérification d'égalité». La question ici portait sur la comparaison relative. De plus, vous n'avez fait aucun effort pour formater le code correctement.
Lasse V.Karlsen
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.