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?
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.
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:
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):
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 intdouble differenceInDays= ts.TotalDays;// This is in double// Difference in Hours.int differenceInHours = ts.Hours;// This is in intdouble differenceInHours= ts.TotalHours;// This is in double// Difference in Minutes.int differenceInMinutes = ts.Minutes;// This is in intdouble differenceInMinutes= ts.TotalMinutes;// This is in double
Você também pode obter a diferença em segundos, milissegundos e ticks.
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.
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();
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!
protectedvoidCalendar1_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;}}
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.
DateTime
e,TimeSpan
como seria de esperar. É tudo bem direto. - Que problema exato você encontrou?Respostas:
Assumindo
StartDate
eEndDate
são do tipoDateTime
:fonte
(a - b).Days
se você estiver interessado no total de dias como umint
em vez de umdouble
com uma representação decimal da diferença parcial dia.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:
Novamente assumindo
StartDate
eEndDate
são do tipoDateTime
.fonte
Days
não para no 365 (como outras propriedadesHours
, comoMinutes
,Second
qual valor nax é o local onde a próxima propriedade mais alta começa). É o mesmo queTotalDays
mas sem frações de um dia e retornando emint
vez dedouble
..Date
peça é realmente útil. Espero que eu estou sendo claroUse o objeto TimeSpan, que é o resultado da subtração de data:
fonte
Eu acho que isso fará o que você quiser:
fonte
fonte
Caso alguém queira vários dias inteiros como um duplo (
a
,b
do tipoDateTime
):fonte
Você também pode obter a diferença em segundos, milissegundos e ticks.
fonte
Você pode tentar isso
fonte
Para iniciantes como eu, vamos encontrar esse pequeno problema, em uma linha simples, com conversão de amostra para int :
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! ^ _ ^
fonte
Usar um período de tempo resolveria os problemas, pois possui muitos atributos:
fonte
Para
a
eb
como doisDateTime
tipos:fonte
Primeiro, declare uma classe que retornará mais tarde:
Use um controle de botão para chamar a classe acima. Aqui está um exemplo:
fonte
Você pode usar o código abaixo:
fonte
Obtenha a diferença entre as duas datas e obtenha os dias a partir de:
fonte
fonte