Differenz zwischen zwei Daten berechnen (Anzahl der Tage)?

1092

Ich sehe, dass diese Frage für Java , JavaScript und PHP beantwortet wurde , aber nicht für C #. Wie kann man also die Anzahl der Tage zwischen zwei Daten in C # berechnen?

Leora
quelle
7
Ich fand das wirklich sehr nützlich. Ich
bekomme
Die Additions- und Subtraktionsoperatoren sind für die Typen DateTimeund TimeSpanwie erwartet überladen . Es ist alles ziemlich einfach. - Auf welches genaue Problem sind Sie gestoßen?
BrainSlugs83

Antworten:

2013

Vorausgesetzt StartDateund EndDatesind vom Typ DateTime:

(EndDate - StartDate).TotalDays
Greg Beech
quelle
549
Diese Antwort ist offensichtlich richtig, aber Sie können sie auch verwenden, (a - b).Dayswenn Sie an den gesamten Tagen interessiert sind, intanstatt doubleeiner dezimalen Darstellung der partiellen Tagesdifferenz.
PFranchise
25
Dies gibt 1 Tag weniger zurück, 08/31 / 2013-08 / 01/2013 = 31, aber dies gibt nur 30 zurück.
JRB
60
@JasRajBishnoi - vielleicht möchten Sie Ihre Mathematik überprüfen. Was ist 31 - 1?
Greg Beech
33
JasRaj hatte auch in dem Sinne Recht, dass es einschließlich beider Daten einen Tag weniger Differenz zurückgibt. Es hängt alles von der Perspektive ab.
Fahad Abid Janjua
28
@FahadAbidJanjua Es ist keine Frage oder Perspektive, sondern eine Frage der Zeit, ich meine, der zeitliche Teil des Datums. 31.08.2013 - 01.08.2013 bedeutet wirklich 31.08.2013 00:00:00 - 01.08.2013 00:00:00, was erklärt, warum es 30 Tage sind, weil der 31.08.2013 Tag ist Gerade beginnend. Dies erklärt auch, warum bei der Abfrage einer DateTime-Eigenschaft / eines DateTime-Felds die richtige Bedingung zum Abrufen eines Bereichs "DateTimeProperty > = FromDate && DateTimeProperty < ToDate.AddDays (1)" ist
Miguel Veloso
160

Die beste Antwort ist richtig. Wenn Sie jedoch nur GANZE Tage als int möchten und gerne auf die Zeitkomponente des Datums verzichten möchten, sollten Sie Folgendes berücksichtigen:

(EndDate.Date - StartDate.Date).Days

Wieder vorausgesetzt StartDateund EndDatesind vom Typ DateTime.

Darren
quelle
7
Die beste Antwort, weil "Anzahl der Tage" normalerweise ganze Tage bedeutet. Es ist erwähnenswert, dass Daysdies nicht bei 365 endet (wie bei anderen Eigenschaften wie Hours, Minutesbei Secondwelchem ​​Nax-Wert die nächsthöhere Eigenschaft beginnt). Es ist das gleiche wie, TotalDaysaber ohne Bruchteile eines Tages und Rückkehr intstatt double.
Tim Schmelter
Funktioniert das immer wie erwartet? Wenn beispielsweise einer der verglichenen Tage ein Sommerzeittag mit "Frühling voraus" ist, könnte die Subtraktion eine Zeitspanne von 23 Stunden ergeben, und wenn ja, wäre der Wert von .Days in dieser 23-Stunden-Zeitspanne 0 ? (Ich habe versucht, selbst damit zu experimentieren, aber meine Ergebnisse sind bisher nicht schlüssig - stackoverflow.com/questions/43644252/… )
Jon Schneider
Ja, das ist es, was ich brauchte - die wertvollste Antwort, jetzt will niemand mehr an Minuten und Sekunden bei der Berechnung von Tagen
denken
Wenn nur 1,5 Tage vergangen sind, zeigt die Funktion "Tage" nur 1 Tag an. Wie kann ich es ändern, um 2 Tage anzuzeigen? Ich muss nur immer + 1 Tag hinzufügen?
CDrosos
2
Dies zu verbessern, da Sie sehr oft "KALENDERTage zwischen zwei Daten" benötigen, nicht nur "Anzahl der 24-Stunden-Intervalle". Beispielsweise müssen Sie in einer Zeitleiste eine Beschriftung "Vor X Tagen" anzeigen. In diesem Fall sollte der Unterschied zwischen "Montag 23:59 Uhr" und "Dienstag 7:00 Uhr" "1 Tag (vor)" sein ... Der .DateTeil ist also wirklich nützlich. Hoffe, ich mache mich klar
Alex
138

Verwenden Sie das TimeSpan-Objekt, das das Ergebnis der Datumssubtraktion ist:

DateTime d1;
DateTime d2;
return (d1 - d2).TotalDays;
Vitaliy Liptchinsky
quelle
2
Upvoted einfach, weil es klar macht, dass (d1 - d2) ein TimeSpan-Objekt zurückgibt.
Morvael
47

Ich denke, das wird tun, was Sie wollen:

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

TimeSpan t = d1 - d2;
double NrOfDays = t.TotalDays;
Pyrocumulus
quelle
34
DateTime xmas = new DateTime(2009, 12, 25);
double daysUntilChristmas = xmas.Subtract(DateTime.Today).TotalDays;
Philip Wallace
quelle
1
Wie auch immer, um die Tage dazwischen im DateTime-Format zu bekommen? Weil ich jedes Datum brauche, um ein bestimmtes Feld in Tabellen zu ändern :) Bearbeiten: Habe es und habe es als Antwort unten gepostet. Danke
sys_debug
4
DateTime xmas = new DateTime (DateTime.Today.Year, 12, 25); würde es Jahr für Jahr funktionieren lassen, nicht nur 2009 :)
1
Subtract () ist der OperatorOverload für DateTimes, also derselbe "(xmas - DateTime.Today) .TotalDays - nur länger.
Marc
20

Falls jemand will numer ganzen Tag als Doppel ( a, bTyp DateTime):

 (a.Date - b.Date).TotalDays
kingPuppy
quelle
3
Dies ist jedoch immer eine ganze Zahl (dh n.00000), da der Datumsanteil immer Mitternacht ist.
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

Sie können den Unterschied auch in Sekunden, Millisekunden und Ticks ermitteln.

Vijay Maheriya
quelle
10

Sie können dies versuchen

EndDate.Date.Subtract(DateTime.Now.Date).Days
Rohidas Kadam
quelle
2
Dies hat mir tatsächlich am besten geholfen, da mein Datumsunterschied einen halben Tag betrug, aber wenn Amerika einen Tag hinter Australien liegt, muss ich sehen, dass es tatsächlich einen Tagesunterschied gibt. Die anderen Antworten in diesem Thread zeigten entweder Null oder eine doppelte Zahl unter 1, die ich nicht brauche.
Barry Guvenkaya
Dies ist die beste Antwort, wenn überprüft werden soll, ob das Datum bereits auf den nächsten Tag übergegangen ist, unabhängig davon, ob es sich zeitlich nicht um einen vollen 24-Stunden-Tag handelt.
Oneberenjena
4

Für Anfänger wie mich, die in einer einfachen Zeile mit Beispielkonvertierung in int auf dieses winzige Problem stoßen werden :

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

Dies berechnet die Gesamtzahl der Tage von heute (DateTime.UtcNow.Date) bis zu einem gewünschten Datum (myDateTime.Date).

Wenn myDateTime gestern oder älter als heute ist, ergibt dies ein positives (+) ganzzahliges Ergebnis.

Wenn myDateTime jedoch morgen oder am zukünftigen Datum ist, führt dies aufgrund von Additionsregeln zu einem negativen (-) ganzzahligen Ergebnis.

Viel Spaß beim Codieren! ^ _ ^

Curbside Coder
quelle
4

Die Verwendung einer Zeitspanne würde die Probleme lösen, da sie viele Attribute hat:

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
quelle
3

Zum a und bals zwei DateTimeTypen:

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
quelle
0

Deklarieren Sie zuerst eine Klasse, die später zurückkehren wird:

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

Verwenden Sie eine Tastensteuerung, um die obige Klasse aufzurufen. Hier ist ein Beispiel:

Muba
quelle
0

Sie können den folgenden Code verwenden:

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

Holen Sie sich die Differenz zwischen den beiden Daten und erhalten Sie dann die Tage von:

int total_days = (EndDate - StartDate).TotalDays
Muhamad Eissa
quelle
1
Während dieses Code-Snippet die Frage lösen kann, hilft eine Erklärung wirklich, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in Zukunft beantworten und diese Personen möglicherweise die Gründe für Ihren Codevorschlag nicht kennen. Bitte versuchen Sie auch, Ihren Code nicht mit erklärenden Kommentaren zu überfüllen, da dies die Lesbarkeit sowohl des Codes als auch der Erklärungen beeinträchtigt!
Auf Wiedersehen StackExchange
2
TotalDays gibt ein Double zurück: msdn.microsoft.com/en-us/library/… Sie benötigen also eine Konvertierung nach 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
quelle
21
Dieser Code ist in vielerlei Hinsicht falsch! 1) Viele Winforms-Codes, die nicht mit der Frage zusammenhängen. 2) Kabelgebundene Art der Anzeige von Meldungsfeldern mit (ich vermute ein WebBrowser-Steuerelement). 3) Verwenden eines WebBrowser-Steuerelements, um einen Text anzuzeigen, der bereits in der Beschriftung angezeigt wird. 4) Verwenden von OperatorOverload Subtract () (Standard für "-" - Operationen), das ohnehin verwendet wird, wenn Sie "MyDateA - MyDateB" ausführen. 5) Keine Erklärung für diesen Code-Stapel.
Marc