Calcular diferença entre duas datas (número de dias)?

1093

Vejo que esta pergunta foi respondida para Java , JavaScript e PHP , mas não em C #. Então, como calcular o número de dias entre duas datas em C #?

leora
fonte
7
Achei isso muito útil realmente .. obter uma lista de datas entre a data de início e data final Espero que isso ajude quem procura esta em particular no futuro :)
sys_debug
Os operadores de adição e subtração estão sobrecarregados para os tipos DateTimee, TimeSpancomo seria de esperar. É tudo bem direto. - Que problema exato você encontrou?
precisa saber é o seguinte

Respostas:

2013

Assumindo StartDatee EndDatesão do tipo DateTime:

(EndDate - StartDate).TotalDays
Greg Beech
fonte
549
Esta resposta é obviamente correta, mas você também pode usar (a - b).Daysse você estiver interessado no total de dias como um intem vez de um doublecom uma representação decimal da diferença parcial dia.
PFranchise
25
isso retornará 1 menos dias, 31/08/2013 - 01/08/2013 = 31, mas retornará apenas 30.
JRB
60
@JasRajBishnoi - você pode querer verificar suas contas. O que é 31-1?
Greg Beech
33
JasRaj também estava certo no sentido de que, inclusive nas duas datas, retorna um dia com menos diferença. Tudo depende da perspectiva.
Fahad Abid Janjua
28
@FahadAbidJanjua Não é uma questão ou perspectiva, mas uma questão de tempo, quero dizer, a parte do tempo da data. 31/08/2013 - 08/01/2013 realmente significa 31/08/2013 00:00:00 - 08/01/2013 00:00:00, o que explica por que são 30 dias, porque o dia 31/08/2013 é Apenas começando. Isso também explica por que, ao consultar em uma propriedade / campo DateTime, a condição adequada para obter uma gama é "DateTimeProperty > = FromDate && DateTimeProperty < ToDate.AddDays (1)"
Miguel Veloso
160

A resposta principal está correta. No entanto, se você desejar apenas TODOS os dias como int e estiver feliz em renunciar ao componente de horário da data, considere:

(EndDate.Date - StartDate.Date).Days

Novamente assumindo StartDatee EndDatesão do tipo DateTime.

Darren
fonte
7
A melhor resposta porque "número de dias" normalmente significa dias inteiros. Vale ressaltar que Daysnão para no 365 (como outras propriedades Hours, como Minutes, Secondqual valor nax é o local onde a próxima propriedade mais alta começa). É o mesmo que TotalDaysmas sem frações de um dia e retornando em intvez de double.
amigos estão dizendo sobre tim Schmelter
Isso sempre funcionará como esperado? Por exemplo, se um dos dias comparados for um dia "horário de verão", a subtração poderá produzir um TimeSpan de 23 horas e, se for o caso, o valor de .Days nesse período de 23 horas será 0 ? (Eu tentei experimentar com isso sozinho, mas meus resultados são inconclusivos até agora - stackoverflow.com/questions/43644252/... )
Jon Schneider
Sim, isso é o que eu precisava - mais valiosa resposta venha agora ninguém quer pensar em minutos e segundos no cálculo dias
solujic
se apenas 1,5 dia tiver passado essa função .Days mostrará apenas 1 dia? como posso alterá-lo para mostrar 2 dias? eu só tenho que adicionar sempre + 1 dia?
CDRosos
2
Voto positivo, porque muitas vezes você precisaria de "CALENDAR dias entre duas datas", não apenas "número de intervalos de 24 horas". Por exemplo, você precisa exibir um rótulo "X dias atrás" em uma linha do tempo. Nesse caso, a diferença entre "Segunda-feira às 23h59" e "Terça-feira às 7h" deve ser "1 dia (atrás)" ... Portanto, a .Datepeça é realmente útil. Espero que eu estou sendo claro
Alex
138

Use o objeto TimeSpan, que é o resultado da subtração de data:

DateTime d1;
DateTime d2;
return (d1 - d2).TotalDays;
Vitaliy Liptchinsky
fonte
2
Votado simplesmente porque deixa claro que o (d1 - d2) retornará um objeto TimeSpan.
Morvael 15/07/16
47

Eu acho que isso fará o que você quiser:

DateTime d1 = DateTime.Now;
DateTime d2 = DateTime.Now.AddDays(-1);

TimeSpan t = d1 - d2;
double NrOfDays = t.TotalDays;
pyrocumulus
fonte
34
DateTime xmas = new DateTime(2009, 12, 25);
double daysUntilChristmas = xmas.Subtract(DateTime.Today).TotalDays;
Philip Wallace
fonte
1
Enfim, para obter os dias no formato DateTime? Porque eu preciso de cada data para modificar um determinado campo nas tabelas :) Editar: peguei e postei como resposta abaixo. Obrigado
sys_debug
4
DateTime xmas = new DateTime (DateTime.Today.Year, 12, 25); iria fazê-lo funcionar em um ano a ano, e não apenas 2009 :)
1
Subtrair () é o OperatorOverload para DateTimes assim é o mesmo "(Natal - DateTime.Today) .TotalDays - apenas mais tempo.
Marc
20

Caso alguém queira vários dias inteiros como um duplo ( a, bdo tipo DateTime):

 (a.Date - b.Date).TotalDays
kingPuppy
fonte
3
Porém, sempre será um número inteiro (ou seja, n.00000) porque a parte da data é sempre meia-noite.
JoeNCA
20
// Difference in days, hours, and minutes.

TimeSpan ts = EndDate - StartDate;

// Difference in days.

int differenceInDays = ts.Days; // This is in int
double differenceInDays= ts.TotalDays; // This is in double

// Difference in Hours.
int differenceInHours = ts.Hours; // This is in int
double differenceInHours= ts.TotalHours; // This is in double

// Difference in Minutes.
int differenceInMinutes = ts.Minutes; // This is in int
double differenceInMinutes= ts.TotalMinutes; // This is in double

Você também pode obter a diferença em segundos, milissegundos e ticks.

Vijay Maheriya
fonte
10

Você pode tentar isso

EndDate.Date.Subtract(DateTime.Now.Date).Days
Rohidas Kadam
fonte
2
Isso realmente me ajudou da melhor maneira, pois minha diferença de datas era de meio dia, mas mesmo assim, quando a América está 1 dia atrás da Austrália, preciso ver que realmente há uma diferença de um dia. As outras respostas mencionadas neste tópico estavam mostrando zero ou algum número duplo abaixo de 1, do qual não preciso.
Barry Guvenkaya # 19/16
Essa é a melhor resposta quando o objetivo é verificar se a data já passou para o dia seguinte, não importa se em termos de tempo não é um dia completo de 24 horas.
oneberenjena
4

Para iniciantes como eu, vamos encontrar esse pequeno problema, em uma linha simples, com conversão de amostra para int :

int totalDays = Convert.ToInt32((DateTime.UtcNow.Date - myDateTime.Date).TotalDays);

Isso calcula o total de dias de hoje (DateTime.UtcNow.Date) até a data desejada (myDateTime.Date).

Se myDateTime for ontem, ou data mais antiga que hoje, isso fornecerá um resultado inteiro positivo (+).

Por outro lado, se myDateTime for amanhã ou na data futura, isso fornecerá um resultado inteiro negativo (-) devido a regras de adição.

Feliz codificação! ^ _ ^

Codificador de calçada
fonte
4

Usar um período de tempo resolveria os problemas, pois possui muitos atributos:

DateTime strt_date = DateTime.Now;
DateTime end_date = Convert.ToDateTime("10/1/2017 23:59:59");
//DateTime add_days = end_date.AddDays(1);
TimeSpan nod = (end_date - strt_date);
Console.WriteLine(strt_date + "" + end_date + "" + "" + nod.TotalHours + "");
Console.ReadKey();
Vijay Vj
fonte
3

Para ae bcomo dois DateTimetipos:

DateTime d = DateTime.Now;
DateTime c = DateTime.Now;
c = d.AddDays(145);
string cc;
Console.WriteLine(d);
Console.WriteLine(c);
var t = (c - d).Days;
Console.WriteLine(t);
cc = Console.ReadLine();
Pratyush Dhanuka
fonte
0

Primeiro, declare uma classe que retornará mais tarde:

public void date()
{
    Datetime startdate;
    Datetime enddate;
    Timespan remaindate;

    startdate = DateTime.Parse(txtstartdate.Text).Date;
    enddate = DateTime.Parse(txtenddate.Text).Date;

    remaindate = enddate - startdate;

    if (remaindate != null)
    {
        lblmsg.Text = "you have left with " + remaindate.TotalDays + "days.";
    }
    else
    {
        lblmsg.Text = "correct your code again.";
    }
}

protected void btncal_Click(object sender, EventArgs e)
{
    date();
}

Use um controle de botão para chamar a classe acima. Aqui está um exemplo:

Muba
fonte
0

Você pode usar o código abaixo:

 int DateDifInSecond = EndDate.Subtract(StartDate).TotalSeconds
Code_Worm
fonte
0

Obtenha a diferença entre as duas datas e obtenha os dias a partir de:

int total_days = (EndDate - StartDate).TotalDays
Muhamad Eissa
fonte
1
Embora esse trecho de código possa resolver a questão, incluir uma explicação realmente ajuda a melhorar a qualidade da sua postagem. Lembre-se de que você está respondendo à pergunta dos leitores no futuro e essas pessoas podem não saber os motivos da sua sugestão de código. Tente também não sobrecarregar seu código com comentários explicativos, pois isso reduz a legibilidade do código e das explicações!
Adeus StackExchange
2
TotalDays retorna um double: msdn.microsoft.com/en-us/library/... Então você precisa de uma conversão para int
qnguyen
-21
protected void Calendar1_SelectionChanged(object sender, EventArgs e)
{
    DateTime d = Calendar1.SelectedDate;
    // int a;
    TextBox2.Text = d.ToShortDateString();
    string s = Convert.ToDateTime(TextBox2.Text).ToShortDateString();
    string s1 =  Convert.ToDateTime(Label7.Text).ToShortDateString();
    DateTime dt = Convert.ToDateTime(s).Date;
    DateTime dt1 = Convert.ToDateTime(s1).Date;
    if (dt <= dt1)
    {
        Response.Write("<script>alert(' Not a valid Date to extend warranty')</script>");
    }
    else
    {
        string diff = dt.Subtract(dt1).ToString();
        Response.Write(diff);
        Label18.Text = diff;
        Session["diff"] = Label18.Text;
    }
}   
sangeetha
fonte
21
Este código está errado de várias maneiras! 1) Muitos códigos WinForms não relacionados à pergunta. 2) Maneira com fio de mostrar caixas de mensagem usando (eu acho que um controle WebBrowser). 3) usando um controle WebBrowser para mostrar um texto que já é mostrado no rótulo. 4) Usando o OperatorOverload Subtract () (padrão para operações "-") que é usado de qualquer maneira se você fizer um "MyDateA - MyDateB". 5) Nenhuma explicação para esta pilha de código.
Marc