Oblicz różnicę między dwiema datami (liczbą dni)?

1092

Widzę, że odpowiedź na to pytanie dotyczyła Java , JavaScript i PHP , ale nie C #. Jak więc obliczyć liczbę dni między dwiema datami w C #?

leora
źródło
7
Uznałem, że to bardzo przydatne naprawdę .. uzyskanie listy dat między datą początkową a końcową Mam nadzieję, że pomoże to każdemu, kto szuka tego w szczególności w przyszłości :)
sys_debug
Operatory dodawania i odejmowania są przeciążone dla typów DateTimei TimeSpanzgodnie z oczekiwaniami. To wszystko jest całkiem proste. - Jaki dokładnie problem napotkałeś?
BrainSlugs83

Odpowiedzi:

2013

Zakładając StartDatei EndDatesą typu DateTime:

(EndDate - StartDate).TotalDays
Greg Beech
źródło
549
Ta odpowiedź jest oczywiście poprawna, ale możesz jej również użyć, (a - b).Daysjeśli interesuje Cię całkowita liczba dni intzamiast doubledziesiętnej reprezentacji częściowej różnicy dni.
PFranchise,
25
to zwróci 1 mniej dni, 08/31 / 2013-08 / 01/2013 = 31, ale zwraca tylko 30.
JRB,
60
@JasRajBishnoi - możesz sprawdzić swoją matematykę. Co to jest 31-1?
Greg Beech,
33
JasRaj miał również rację w tym sensie, że włączając obie daty, zwraca różnicę mniejszą o jeden dzień. Wszystko zależy od perspektywy.
Fahad Abid Janjua,
28
@FahadAbidJanjua To nie jest kwestia ani perspektywa, ale kwestia czasu, to znaczy części czasowej daty. 08.08.2013 - 01.01.2013 naprawdę oznacza 08/31/2013 00:00:00 - 08/01/2013 00:00:00, co wyjaśnia, dlaczego jest to 30 dni, ponieważ dzień 31.08.2013 jest dopiero zaczyna. To wyjaśnia również, dlaczego podczas zapytania o właściwość / pole DateTime właściwym warunkiem uzyskania zakresu jest „DateTimeProperty > = FromDate && DateTimeProperty < ToDate.AddDays (1)”
Miguel Veloso
159

Najlepsza odpowiedź jest prawidłowa, ale jeśli chcesz tylko CAŁE dni jako int i z przyjemnością rezygnujesz z komponentu czasu w dacie, rozważ:

(EndDate.Date - StartDate.Date).Days

Ponownie zakładając StartDatei EndDatesą w rodzaju DateTime.

Darren
źródło
7
Najlepsza odpowiedź, ponieważ „liczba dni” zwykle oznacza całe dni. Warto zauważyć, że Daysnie kończy się na 365 (jak inne właściwości, takie jak Hours, Minutes, Secondktórego wartość jest Nax gdzie zaczyna się następny wyższy nieruchomość). Jest taki sam, TotalDaysale bez ułamków dnia i wraca intzamiast double.
Tim Schmelter
Czy to zawsze będzie działać zgodnie z oczekiwaniami? Na przykład, jeśli jeden z porównywanych dni to „dzień wiosny” czasu letniego, czy odjęcie może dać przedział czasu wynoszący 23 godziny, a jeśli tak, to wartość .Dzień w tym 23-godzinnym przedziale czasu będzie wynosić 0 ? (Sam próbowałem z tym eksperymentować, ale moje dotychczasowe wyniki nie są jednoznaczne - stackoverflow.com/questions/43644252/... )
Jon Schneider
Tak, właśnie tego potrzebowałem - najcenniejsza odpowiedź cmon teraz nikt nie chce myśleć o minutach i sekundach przy obliczaniu dni
solujic
jeśli minęło tylko 1,5 dnia. Funkcja dni pokaże tylko 1 dzień? jak mogę to zmienić, aby wyświetlać 2 dni? po prostu muszę zawsze dodawać + 1 dzień?
CDrosos,
2
Poproś o to, ponieważ bardzo często potrzebujesz „KALENDARZA dni między dwiema datami”, a nie tylko „liczby 24-godzinnych odstępów”. Na przykład musisz wyświetlić na osi czasu etykietę „X dni temu”. W tym przypadku różnica między „poniedziałkiem 23:59” a „wtorek 7:00 rano” powinna wynosić „1 dzień (temu)”… Więc ta .Dateczęść jest naprawdę przydatna. Mam nadzieję, że wyrazię się jasno
Alex
138

Użyj obiektu TimeSpan, który jest wynikiem odjęcia daty:

DateTime d1;
DateTime d2;
return (d1 - d2).TotalDays;
Witalij Liptchinsky
źródło
2
Awansowano po prostu dlatego, że wyjaśnia, że ​​(d1 - d2) zwróci obiekt TimeSpan.
Morvael,
47

Myślę, że zrobi to, co chcesz:

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

TimeSpan t = d1 - d2;
double NrOfDays = t.TotalDays;
pirokumulus
źródło
34
DateTime xmas = new DateTime(2009, 12, 25);
double daysUntilChristmas = xmas.Subtract(DateTime.Today).TotalDays;
Philip Wallace
źródło
1
W każdym razie, aby uzyskać dni pomiędzy w formacie DateTime? Ponieważ potrzebuję każdej daty, aby zmodyfikować określone pole w tabelach :) Edytuj: Mam go i opublikowałem jako odpowiedź poniżej. Dzięki
sys_debug,
4
DateTime xmas = new DateTime (DateTime.Today.Year, 12, 25); sprawi, że będzie działać z roku na rok, nie tylko 2009 roku :)
1
Subtract () to OperatorOverload dla DateTimes, więc jest taki sam "(xmas - DateTime.Today) .TotalDays - tylko dłużej.
Marc
20

W przypadku gdy ktoś chce numer całych dni jako podwójne ( a, btypu DateTime):

 (a.Date - b.Date).TotalDays
kingPuppy
źródło
3
Będzie to zawsze liczba całkowita (tj. N.00000), ponieważ część Data jest zawsze północą.
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

Różnicę możesz także uzyskać w sekundach, milisekundach i tyknięciach.

Vijay Maheriya
źródło
10

Możesz tego spróbować

EndDate.Date.Subtract(DateTime.Now.Date).Days
Rohidas Kadam
źródło
2
To naprawdę pomogło mi najlepiej, ponieważ moja różnica dat wynosiła pół dnia, ale mimo to, gdy Ameryka jest o 1 dzień za Australią, muszę zauważyć, że różnica jest o jeden dzień. Inne odpowiedzi wspomniane w tym wątku zawierały zero lub podwójną liczbę poniżej 1, której nie potrzebuję.
Barry Guvenkaya
To najlepsza odpowiedź, gdy celem jest sprawdzenie, czy data minęła już następnego dnia, bez względu na to, czy pod względem czasu nie jest to pełny 24-godzinny dzień.
oneberenjena
4

Dla początkujących takich jak ja napotkasz ten drobny problem, w prostej linii, z przykładową konwersją na int :

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

To oblicza całkowitą liczbę dni od dzisiaj (DateTime.UtcNow.Date) do żądanej daty (myDateTime.Date).

Jeśli myDateTime jest wczorajszą lub starszą datą niż dzisiaj, da to dodatni wynik (+) liczby całkowitej.

Z drugiej strony, jeśli myDateTime jest jutro lub w przyszłości, da to wynik ujemny (-) liczba całkowita ze względu na reguły dodawania.

Miłego kodowania! ^ _ ^

Curbside Coder
źródło
4

Użycie przedziału czasu rozwiązałoby problemy, ponieważ ma wiele atrybutów:

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
źródło
3

Dla ai bjako dwa DateTimetypy:

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
źródło
0

Najpierw zadeklaruj klasę, która powróci później:

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

Użyj przycisku, aby wywołać powyższą klasę. Oto przykład:

Muba
źródło
0

Możesz użyć kodu poniżej:

 int DateDifInSecond = EndDate.Subtract(StartDate).TotalSeconds
Code_Worm
źródło
0

Uzyskaj różnicę między dwiema datami, a następnie uzyskaj dni od:

int total_days = (EndDate - StartDate).TotalDays
Muhamad Eissa
źródło
1
Ten fragment kodu może rozwiązać pytanie, ale wyjaśnienie naprawdę pomaga poprawić jakość posta. Pamiętaj, że w przyszłości odpowiadasz na pytanie czytelników, a ci ludzie mogą nie znać przyczyn Twojej sugestii kodu. Staraj się również nie tłoczyć kodu objaśniającymi komentarzami, ponieważ zmniejsza to czytelność zarówno kodu, jak i objaśnień!
Do widzenia StackExchange
2
TotalDays zwraca podwójną wartość: msdn.microsoft.com/en-us/library/… Więc potrzebujesz konwersji do 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
źródło
21
Ten kod jest zły na wiele sposobów! 1) Wiele kodów Winforms niezwiązanych z pytaniem. 2) Przewodowy sposób wyświetlania skrzynek wiadomości za pomocą (Myślę, że kontrolka WebBrowser). 3) za pomocą kontrolki WebBrowser, aby wyświetlić tekst, który jest już wyświetlany na etykiecie. 4) Użycie OperatorOverload Subtract () (domyślnie dla operacji „-”), które jest używane w każdym przypadku, jeśli wykonasz „MyDateA - MyDateB”. 5) Żadnego wyjaśnienia tego stosu kodu.
Marc