Обчисліть різницю між двома датами (кількістю днів)?


1092

Я бачу, що на це питання відповіли Java , JavaScript та PHP , але не C #. Отже, як можна обчислити кількість днів між двома датами в C #?


7
Я вважаю це досить корисним насправді .. отримання списку дат між початковою датою та датою закінчення Сподіваюся, що це допоможе тим, хто шукає цього, зокрема, у майбутньому :)
sys_debug

Оператори додавання і віднімання перевантажуються для типів DateTimeі TimeSpanтипів, як ви очікували. Все досить просто. - З якою точно проблемою ви стикалися?
BrainSlugs83

Відповіді:


2013

Якщо припустити StartDateі EndDateмають тип DateTime:

(EndDate - StartDate).TotalDays

549
Ця відповідь, очевидно, правильна, але ви також можете використовувати, (a - b).Daysякщо вас цікавлять загальні дні, intа не doubleдесяткове представлення часткової різниці в день.
PFranchise

25
це повернеться на 1 менше днів, 08/31 / 2013-08 / 01/2013 = 31, але це повертається лише 30.
JRB

60
@JasRajBishnoi - можливо, ви захочете перевірити математику. Що таке 31 - 1?
Грег Бук

33
JasRaj також мав рацію в тому сенсі, що включно до обох дат він повертається на день менше різниці. Все залежить від точки зору.
Фахад Абід Джанджуа

28
@FahadAbidJanjua Це не питання чи перспектива, а питання часу, я маю на увазі часову частину дати. 31.08.2013 - 01.08.2013 дійсно означає 31.08.2013 00:00:00 - 01.08.2013 00:00:00, що пояснює, чому це 30 днів, адже 31.08.2013 день тільки починається. Це також пояснює, чому при запиті про властивість / поле DateTime належним умовою для отримання діапазону є "DateTimeProperty > = FromDate && DateTimeProperty < ToDate.AddDays (1)"
Мігель

160

Верхня відповідь правильна, проте, якщо ви хочете, щоб цілі дні були як int і раді відмовитись від часової складової дати, тоді врахуйте:

(EndDate.Date - StartDate.Date).Days

Знову ж таки припущення StartDateі EndDateє типом DateTime.


7
Найкраща відповідь, тому що "кількість днів" зазвичай означає цілі дні. Варто відзначити , що Daysне зупиняється на 365 (як і інші властивості , такі як Hours, Minutes, Secondякі НАКС значення , де починається наступний вище властивість). Це те саме, TotalDaysале без фракцій дня і повернення intзамість double.
Тім Шмелтер

Чи завжди це буде працювати так, як очікувалося? Наприклад, якщо один з днів, що порівнюються, - літній день "весна вперед", чи може віднімання дати часовий проміжок 23 години, і якщо так, то значення значення. ? (Я сам спробував експериментувати з цим, але мої результати поки що є непереконливими - stackoverflow.com/questions/43644252/… )
Джон Шнайдер,

Так, це мені було потрібно - найцінніша відповідь cmon зараз ніхто не хоче думати про хвилини та секунди підрахунку днів
solujic

якщо це пройшло лише 1,5 дня. Функція дня буде показувати лише 1 день? як я можу змінити його на показ 2 дні? я просто повинен завжди додавати +1 день?
CDrosos

2
Підтверджуючи це, тому що дуже часто вам знадобляться "КАЛЕНДАРНІ дні між двома датами", а не просто "кількість інтервалів 24 години". Наприклад, потрібно відобразити позначку "X днів тому" на часовій шкалі. У цьому випадку різниця між "понеділком 23:59" та "вівторок 7:00 ранку" повинна бути "1 день (тому)" ... Отже, .Dateчастина справді корисна. Сподіваюся, я даю зрозуміти
Алекс

138

Використовуйте об'єкт TimeSpan, який є результатом субстракції дати:

DateTime d1;
DateTime d2;
return (d1 - d2).TotalDays;

2
Оновлено просто тому, що дає зрозуміти, що (d1 - d2) поверне об'єкт TimeSpan.
Morvael

47

Я думаю, що це зробить те, що ти хочеш:

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
У будь-якому випадку, щоб провести дні між ними у форматі DateTime? Оскільки мені потрібна кожна дата, щоб змінити певне поле в таблицях :) Редагувати: Отримав це і розмістив його як відповідь нижче. Дякую
sys_debug

4
DateTime xmas = новий DateTime (DateTime.Today.Year, 12, 25); зробить це щорічно, а не лише 2009 :)

1
Subtract () є OperatorOverload для DateTimes так його ж «(Різдво - DateTime.Today) .TotalDays - тільки більше.
Марк

20

У разі , якщо хто - то хоче Numer цілих днів , як подвійні ( a, bтипу DateTime):

 (a.Date - b.Date).TotalDays

3
Це завжди буде ціле число (тобто n.00000), оскільки частина дати завжди опівночі.
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

Ви також можете отримати різницю в секундах, мілісекундах і кліщах.


10

Ви можете спробувати це

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

2
Це насправді допомогло мені найкраще, оскільки моя різниця в даті склала півдня, але все ж, коли Америка на 1 день відстає від Австралії, мені потрібно побачити, що насправді є різниця в одному дні. Інші відповіді, згадані в цій темі, показували нуль або подвійне число нижче 1, яке мені не потрібно.
Баррі Гувенкая

Це найкраща відповідь, коли мета - перевірити, чи дата вже перейшла на наступний день, незалежно від того, чи час не є повним 24-годинним днем.
oneberenjena

4

Для початківців, як я, які натрапляють на цю крихітну проблему, простим рядком, з перетворенням зразка в int :

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

Це обчислює загальну кількість днів від сьогодні (DateTime.UtcNow.Date) до бажаної дати (myDateTime.Date).

Якщо myDateTime вчора або старіша дата, ніж сьогодні, це дасть позитивний (+) цілий результат.

З іншого боку, якщо myDateTime буде завтра або на майбутню дату, це дасть негативний (-) цілий результат через правила додавання.

Щасливого кодування! ^ _ ^


4

Використання часового діапазону дозволить вирішити проблеми, оскільки він має багато атрибутів:

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

Для aта bяк два DateTimeтипи:

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

Спочатку оголосіть клас, який повернеться пізніше:

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

Використовуйте кнопки управління для виклику вищевказаного класу. Ось приклад:


0

Ви можете використовувати код нижче:

 int DateDifInSecond = EndDate.Subtract(StartDate).TotalSeconds

0

Отримайте різницю між двома датами, а потім отримайте дні від:

int total_days = (EndDate - StartDate).TotalDays

1
Хоча цей фрагмент коду може вирішити питання, зокрема пояснення дійсно допомагає покращити якість вашої публікації. Пам’ятайте, що ви відповідаєте на запитання читачів у майбутньому, і ці люди можуть не знати причини вашої пропозиції щодо коду. Будь ласка, намагайтеся не переповнювати свій код пояснювальними коментарями, оскільки це зменшує читабельність і коду, і пояснень!
Goodbye StackExchange

2
TotalDays повертає подвійний: msdn.microsoft.com/en-us/library/… Отже, вам потрібно перейти до 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
Цей код помилковий у багатьох способах! 1) Багато Winforms-коду, не пов'язаного з питанням. 2) Провідний спосіб показу скриньки повідомлень за допомогою (я думаю, що управління WebBrowser). 3) за допомогою елемента керування WebBrowser показати текст, який уже показаний на етикетці. 4) Використання OperatorOverload Subtract () (за замовчуванням для операцій "-"), яке в будь-якому випадку використовується, якщо ви робите "MyDateA - MyDateB". 5) Немає пояснення цій купі коду.
Марк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.