Como comparar DateTime em c #?


137

Não quero que o usuário indique a data ou hora atrasada.

Como posso comparar se a data e hora inseridas são MENOS e a hora atual?

Se a data e a hora atuais forem 17 de junho de 2010, 12:25, desejo que o usuário não possa fornecer a data antes de 17 de junho de 2010 e a hora antes das 12:25.

Como minha função, retorne false se o horário digitado pelo usuário for 16 de junho de 2010 e o horário 12:24

Respostas:


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
Sua resposta fornece uma maneira de ver qual é a diferença, em vez de apenas saber que a data é anterior ou posterior. É claro que a resposta dele é melhor para o OP, mas a sua é melhor para algumas pessoas que chegaram aqui do google (incluídas).
levininja

2
Eu achei a sua resposta valiosa, porque eu estou olhando para algum código legado, onde este é usado
Erik Bergstedt

Aqui está o link
Harsh Raj

Mas do ponto de vista da depuração, a resposta do MuSTaNG é mais legível.
Himalaias Garg

295

A Microsoft também implementou os operadores '<' e '>'. Então você as usa para comparar duas datas.

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

6
MSDN de origem; eles são documentados como operadores de DateTime desajeitadamente rotulados como "DateTime.Gorgeous than", "DateTime.LessThanOrEqualTo" ..... msdn.microsoft.com/en-us/library/ff986512%28v=vs.90%29.aspx
Salman Siddiqui


2
Estou usando o Unity 2017 e o uso desse operador para classificar listas me dá resultados errados. Até tentei comparar o DateTime.ticks diretamente e isso também falhou. Eu tive que usar DateTime.CompareTo para chegar aos resultados certos e não sei por que.
lin

2
Isto está errado. Não é possível comparar o UTC e a hora local da maneira certa.
Altiano Gerung

4
Esta não é uma resposta completa. Ao levar o DateTime Kind à consideração, deve ser um date1.ToLocalTime() < DateTime.Nowou date1.ToUniversalTime() < DateTime.UtcNow.
yurislav 27/09/18

21

A resposta do MuSTaNG diz tudo, mas ainda estou adicionando para torná-lo um pouco mais elaborado, com links e tudo.


Os operadores convencionais

estão disponíveis DateTimedesde o .NET Framework 1.1. Além disso, a adição e subtração de DateTimeobjetos também são possíveis usando operadores convencionais +e -.

Um exemplo do MSDN:

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

Outros operadores podem ser usados ​​da mesma forma.

Aqui está a lista para a qual todos os operadores estão disponíveis DateTime.


1
Você pode apenas editar a resposta deles para elaborar. Em qualquer caso, você não pode usar +para dois DateTimeoperandos, Você pode fazer DateTime - DateTime, ou DateTime + TimeSpan, ou DateTime - TimeSpan.
Joey

5

Em geral, você precisa comparar DateTimescom o mesmo Kind:

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

Explicação do MSDN sobre DateTime.Compare(Isto também é relevante para os operadores como >, <, ==e etc.):

Para determinar o relacionamento de t1 para t2, o método Compare compara a propriedade Ticks de t1 e t2, mas ignora a propriedade Kind . Antes de comparar os objetos DateTime, verifique se os objetos representam horários no mesmo fuso horário.

Assim, uma comparação simples pode dar um resultado inesperado ao lidar com o DateTimesque é representado em fusos horários diferentes.


Só tinha um erro por causa deste ... wth eles estavam pensando quando fizeram esse método :(
Legolas

3

Se você tiver dois DateTime com a mesma aparência, mas Compare ou Igual não retornam o que você espera, é assim que compará-los.

Aqui está um exemplo com precisão de 1 milissegundo:

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
Ele quer comparar DateTimenãostring
Danh

você pode converter datetime para string
Dieu Phan Dinh

ou: você pode usar: DateTime.Compare (startDate, endDate)
Dieu Phan Dinh

Não é problema meu e é diferente do de Ahmet ?
Danh

0

Aqui está um exemplo simples e típico do ambiente da 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
No .NET, "Comparar" geralmente significa "comparação relativa" e não "verificação de igualdade". A questão aqui era sobre comparação relativa. Além disso, você não fez nenhum esforço para formatar o código corretamente.
Lasse V. Karlsen
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.