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?
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:
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.
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:
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):
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 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
Sie können den Unterschied auch in Sekunden, Millisekunden und Ticks ermitteln.
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.
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();
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!
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;}}
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.
DateTime
undTimeSpan
wie erwartet überladen . Es ist alles ziemlich einfach. - Auf welches genaue Problem sind Sie gestoßen?Antworten:
Vorausgesetzt
StartDate
undEndDate
sind vom TypDateTime
:quelle
(a - b).Days
wenn Sie an den gesamten Tagen interessiert sind,int
anstattdouble
einer dezimalen Darstellung der partiellen Tagesdifferenz.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:
Wieder vorausgesetzt
StartDate
undEndDate
sind vom TypDateTime
.quelle
Days
dies nicht bei 365 endet (wie bei anderen Eigenschaften wieHours
,Minutes
beiSecond
welchem Nax-Wert die nächsthöhere Eigenschaft beginnt). Es ist das gleiche wie,TotalDays
aber ohne Bruchteile eines Tages und Rückkehrint
stattdouble
..Date
Teil ist also wirklich nützlich. Hoffe, ich mache mich klarVerwenden Sie das TimeSpan-Objekt, das das Ergebnis der Datumssubtraktion ist:
quelle
Ich denke, das wird tun, was Sie wollen:
quelle
quelle
Falls jemand will numer ganzen Tag als Doppel (
a
,b
TypDateTime
):quelle
Sie können den Unterschied auch in Sekunden, Millisekunden und Ticks ermitteln.
quelle
Sie können dies versuchen
quelle
Für Anfänger wie mich, die in einer einfachen Zeile mit Beispielkonvertierung in int auf dieses winzige Problem stoßen werden :
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! ^ _ ^
quelle
Die Verwendung einer Zeitspanne würde die Probleme lösen, da sie viele Attribute hat:
quelle
Zum
a
undb
als zweiDateTime
Typen:quelle
Deklarieren Sie zuerst eine Klasse, die später zurückkehren wird:
Verwenden Sie eine Tastensteuerung, um die obige Klasse aufzurufen. Hier ist ein Beispiel:
quelle
Sie können den folgenden Code verwenden:
quelle
Holen Sie sich die Differenz zwischen den beiden Daten und erhalten Sie dann die Tage von:
quelle
quelle