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 #?


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

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.


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;

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;

34
DateTime xmas = new DateTime(2009, 12, 25);
double daysUntilChristmas = xmas.Subtract(DateTime.Today).TotalDays;

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

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.


10

Você pode tentar isso

EndDate.Date.Subtract(DateTime.Now.Date).Days

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! ^ _ ^


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();

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();

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:


0

Você pode usar o código abaixo:

 int DateDifInSecond = EndDate.Subtract(StartDate).TotalSeconds

0

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

int total_days = (EndDate - StartDate).TotalDays

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;
    }
}   

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
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.