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


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

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.


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;

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;

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

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

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.


10

Vous pouvez essayer ceci

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

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


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

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

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:


0

Vous pouvez utiliser le code ci-dessous:

 int DateDifInSecond = EndDate.Subtract(StartDate).TotalSeconds

0

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

int total_days = (EndDate - StartDate).TotalDays

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.