¿Cómo comparar DateTime en C #?

137

No quiero que el usuario dé la fecha u hora de regreso.

¿Cómo puedo comparar si la fecha y hora ingresadas son MENORES que la hora actual?

Si la fecha y hora actuales son el 17 de junio de 2010, 12:25 p.m., quiero que el usuario no pueda dar la fecha antes del 17 de junio a 2010 y la hora antes de las 12:25 p.m.

Al igual que mi función, devuelve falso si la hora ingresada por el usuario es el 16 de junio de 2010 y la hora 12:24 p.m.

Ashish Ashu
fuente

Respuestas:

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ı
fuente
3
Su respuesta proporciona una manera de ver cuál es la diferencia en lugar de simplemente saber que la fecha es anterior o posterior. Por supuesto, su respuesta es mejor para el OP, pero la suya es mejor para algunas personas que llegaron aquí desde Google (auto incluido).
levininja
2
Encontré su respuesta valiosa porque estoy viendo un código heredado donde se usa esto
Erik Bergstedt
Aquí está el enlace de MSDN
Harsh Raj
Pero desde el punto de vista de la depuración, la respuesta de MuSTaNG es más legible.
Himalaya Garg
295

Microsoft también ha implementado los operadores '<' y '>'. Entonces los usas para comparar dos fechas.

if (date1 < DateTime.Now)
   Console.WriteLine("Less than the current time!");
Mustango
fuente
66
Fuente MSDN; estos están documentados como Operadores DateTime etiquetados torpemente como "DateTime.Greater than", "DateTime.LessThanOrEqualTo" ..... msdn.microsoft.com/en-us/library/ff986512%28v=vs.90%29.aspx
Salman Siddiqui
2
Estoy usando Unity 2017 y usar este operador para ordenar listas me da resultados incorrectos. Incluso intenté comparar DateTime.ticks directamente y eso también falló. Tuve que usar DateTime.CompareTo para llegar a los resultados correctos y no sé por qué.
lin
2
Esto está mal. Esto no puede comparar UTC y hora local de la manera correcta.
Altiano Gerung
44
Esta no es la respuesta completa. Al llevar DateTime Kind a ocideideration, debe ser date1.ToLocalTime() < DateTime.Nowo date1.ToUniversalTime() < DateTime.UtcNow.
yurislav
21

La respuesta de MuSTaNG lo dice todo, pero todavía lo estoy agregando para hacerlo un poco más elaborado, con enlaces y todo.


Los operadores convencionales

están disponibles DateTimedesde .NET Framework 1.1. Además, la suma y resta de DateTimeobjetos también es posible utilizando operadores convencionales +y- .

Un ejemplo de MSDN:

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

Otros operadores pueden ser utilizados de la misma manera.

Aquí está la lista para todos los operadores disponibles DateTime.

Sнаđошƒаӽ
fuente
1
Podrías editar su respuesta para elaborar. En cualquier caso, no puede usar +dos DateTimeoperandos, puede hacer DateTime - DateTime, o DateTime + TimeSpan, o DateTime - TimeSpan.
Joey
5

En general caso necesita comparar DateTimescon el mismo Kind:

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

Explicación de MSDN sobre DateTime.Compare(Esto también es relevante para operadores como >, <, ==y etc.):

Para determinar la relación de t1 a t2, el método Compare compara la propiedad Ticks de t1 y t2 pero ignora su propiedad Kind . Antes de comparar objetos DateTime, asegúrese de que los objetos representen horas en la misma zona horaria.

Por lo tanto, una comparación simple puede dar un resultado inesperado cuando se trata de DateTimesque se representan en diferentes zonas horarias.

AlbertK
fuente
Acabo de tener un error debido a esto ... con qué estaban pensando cuando hicieron ese método :(
Legolas
3

Si tiene dos DateTime que se ven iguales, pero Compare or Equals no devuelve lo que esperaba, esta es la forma de compararlos.

Aquí un ejemplo con precisión de 1 milisegundo:

bool areSame = (date1 - date2) > TimeSpan.FromMilliseconds(1d);
Yannick Triqueneaux
fuente
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
fuente
2
Él quiere comparar DateTimenostring
Danh
puedes convertir datetime a string
Dieu Phan Dinh
o: puede usar: DateTime.Compare (startDate, endDate)
Dieu Phan Dinh
¿No es mi problema y es diferente al de Ahmet ?
Danh
0

Aquí hay un ejemplo simple típico en el entorno de 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
fuente
-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
fuente
44
En .NET, "Comparar" generalmente significa "comparación relativa" y no "verificación de igualdad". La pregunta aquí era sobre la comparación relativa. Además, no hizo ningún esfuerzo para formatear el código correctamente.
Lasse V. Karlsen