Calculer la différence entre deux dates (nombre de jours)?

1094

Je vois que cette question a été répondue pour Java , JavaScript et PHP , mais pas C #. Alors, comment calculer le nombre de jours entre deux dates en C #?

leora
la source
7
J'ai trouvé cela très utile vraiment .. obtenir une liste de dates entre la date de début et la date de fin J'espère que cela aidera quiconque le recherchera en particulier à l'avenir :)
sys_debug
Les opérateurs d'addition et de soustraction sont surchargés pour les types DateTimeet TimeSpancomme vous pouvez vous y attendre. C'est assez simple. - Quel problème exact avez-vous rencontré?
BrainSlugs83

Réponses:

2015

En supposant StartDateet EndDatesont de type DateTime:

(EndDate - StartDate).TotalDays
Greg Beech
la source
549
Cette réponse est évidemment correcte, mais vous pouvez également l'utiliser (a - b).Dayssi vous êtes intéressé par le nombre total de jours comme un intplutôt qu'avec un doubleavec une représentation décimale de la différence de jour partielle.
PFranchise
25
cela renverra 1 jours de moins, 31/08/2013 08/01/2013 = 31 mais cela revient 30 seulement.
JRB
60
@JasRajBishnoi - vous voudrez peut-être vérifier vos mathématiques. Qu'est-ce que 31 - 1?
Greg Beech
33
JasRaj avait également raison en ce sens que les deux dates incluses, il revient un jour de moins en différence. Tout dépend de la perspective.
Fahad Abid Janjua
28
@FahadAbidJanjua Ce n'est pas une question ou une perspective mais une question de temps, je veux dire, la partie temporelle de la date. 31/08/2013 - 01/08/2013 signifie vraiment 31/08/2013 00:00:00 - 01/08/2013 00:00:00 ce qui explique pourquoi c'est 30 jours, car le jour 08/31/2013 est commence à peine. Cela explique également pourquoi, lors d'une requête sur une propriété / un champ DateTime, la condition appropriée pour obtenir une plage est "DateTimeProperty > = FromDate && DateTimeProperty < ToDate.AddDays (1)"
Miguel Veloso
161

La première réponse est correcte, cependant, si vous ne souhaitez que des jours entiers en tant qu'int et êtes heureux de renoncer à la composante horaire de la date, envisagez:

(EndDate.Date - StartDate.Date).Days

Supposons à nouveau StartDateet EndDatesont de type DateTime.

Darren
la source
7
La meilleure réponse car «nombre de jours» signifie normalement des jours entiers. Il convient de noter que Daysne s'arrête pas à 365 (comme d' autres biens similaires Hours, Minutes, Seconddont la valeur est nax où commence la prochaine propriété plus). C'est la même chose que TotalDaysmais sans fractions de jour et en revenant intau lieu de double.
Tim Schmelter
Est-ce que cela fonctionnera toujours comme prévu? Par exemple, si l'un des jours comparés est un jour "Spring ahead" Daylight Saving Time, la soustraction peut-elle produire un TimeSpan de 23 heures et, dans l'affirmative, la valeur de .Days sur cette période de 23 heures serait-elle égale à 0? ? (J'ai essayé de l'expérimenter moi-même, mais mes résultats ne sont pas concluants jusqu'à présent - stackoverflow.com/questions/43644252/… )
Jon Schneider
Oui, c'est ce dont j'avais besoin - la réponse la plus précieuse est maintenant que personne ne veut penser aux minutes et aux secondes dans le calcul des jours
solujic
si seulement 1,5 jour s'est écoulé, la fonction .Days n'affichera que 1 jour? comment puis-je le modifier pour afficher 2 jours? je dois juste toujours ajouter + 1 jour?
CDrosos
2
Votez pour cela, car très souvent vous aurez besoin de "CALENDRIER jours entre deux dates", pas seulement "nombre d'intervalles de 24 heures". Par exemple, vous devez afficher une étiquette "il y a X jours" dans une chronologie. Dans ce cas la différence entre "Lundi 23h59" et "Mardi 7h00" devrait être de "1 jour (il y a)" ... Donc la .Datepartie est vraiment utile. J'espère que je me fais comprendre
Alex
138

Utilisez l'objet TimeSpan qui est le résultat de la soustraction de date:

DateTime d1;
DateTime d2;
return (d1 - d2).TotalDays;
Vitaliy Liptchinsky
la source
2
Surévalué simplement parce qu'il indique clairement que (d1 - d2) renverra un objet TimeSpan.
Morvael
47

Je pense que cela fera ce que vous voulez:

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

TimeSpan t = d1 - d2;
double NrOfDays = t.TotalDays;
pyrocumulus
la source
34
DateTime xmas = new DateTime(2009, 12, 25);
double daysUntilChristmas = xmas.Subtract(DateTime.Today).TotalDays;
Philip Wallace
la source
1
Quoi qu'il en soit pour obtenir les jours entre les deux au format DateTime? Parce que j'ai besoin de chaque date pour modifier un certain champ dans les tableaux :) Edit: Je l'ai et je l'ai affiché comme réponse ci-dessous. Merci
sys_debug
4
DateTime xmas = new DateTime (DateTime.Today.Year, 12, 25); le ferait fonctionner d'année en année, pas seulement en 2009 :)
1
Soustraire () est le OperatorOverload pour DateTimes si ses mêmes « (Noël - DateTime.Today) .TotalDays - juste plus.
Marc
20

Si quelqu'un veut un nombre de jours entiers en double ( a, bde type DateTime):

 (a.Date - b.Date).TotalDays
kingPuppy
la source
3
Ce sera toujours un nombre entier (par exemple, n.00000) car la partie Date est toujours minuit.
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

Vous pouvez également obtenir la différence en secondes, millisecondes et ticks.

Vijay Maheriya
la source
10

Vous pouvez essayer ceci

EndDate.Date.Subtract(DateTime.Now.Date).Days
Rohidas Kadam
la source
2
Cela m'a vraiment aidé le mieux car ma différence de date était d'une demi-journée, mais quand l'Amérique a 1 jour de retard sur l'Australie, je dois voir qu'il y a en fait une différence d'un jour. Les autres réponses mentionnées dans ce fil montraient soit zéro soit un certain nombre double en dessous de 1 dont je n'ai pas besoin.
Barry Guvenkaya
C'est la meilleure réponse lorsque le but est de vérifier si la date est déjà passée au lendemain, peu importe si en termes de temps n'est pas une journée complète de 24h.
oneberenjena
4

Pour les débutants comme moi qui tomberont sur ce petit problème, dans une ligne simple, avec un exemple de conversion en int :

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

Cela calcule le nombre total de jours à partir d'aujourd'hui (DateTime.UtcNow.Date) jusqu'à une date souhaitée (myDateTime.Date).

Si myDateTime est hier ou date antérieure à aujourd'hui, cela donnera un résultat entier positif (+).

D'un autre côté, si myDateTime est demain ou à la date future, cela donnera un résultat entier négatif (-) en raison des règles d'addition.

Bon codage! ^ _ ^

Curbside Coder
la source
4

L'utilisation d'un intervalle de temps résoudrait les problèmes car il possède de nombreux attributs:

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
la source
3

Pour aet bcomme deux DateTimetypes:

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
la source
0

Déclarez d'abord une classe qui reviendra plus tard:

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

Utilisez un contrôle bouton pour appeler la classe ci-dessus. Voici un exemple:

Muba
la source
0

Vous pouvez utiliser le code ci-dessous:

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

Obtenez la différence entre les deux dates, puis obtenez les jours à partir de:

int total_days = (EndDate - StartDate).TotalDays
Muhamad Eissa
la source
1
Bien que cet extrait de code puisse résoudre la question, y compris une explication aide vraiment à améliorer la qualité de votre message. N'oubliez pas que vous répondrez à la question pour les lecteurs à l'avenir, et ces personnes pourraient ne pas connaître les raisons de votre suggestion de code. Essayez également de ne pas surcharger votre code avec des commentaires explicatifs, car cela réduit la lisibilité du code et des explications!
Au revoir StackExchange
2
TotalDays renvoie un double: msdn.microsoft.com/en-us/library/… Vous avez donc besoin d'une conversion en 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
la source
21
Ce code est faux à bien des égards! 1) Beaucoup de code Winforms non lié à la question. 2) Manière filaire de montrer des boîtes de message utilisant (je suppose un contrôle WebBrowser). 3) à l'aide d'un contrôle WebBrowser pour afficher un texte déjà affiché dans l'étiquette. 4) Utilisation de OperatorOverload Subtract () (par défaut pour les opérations "-") qui est utilisé de toute façon si vous effectuez un "MyDateA - MyDateB". 5) Aucune explication sur cette pile de code.
Marc