Рассчитать разницу между двумя датами (количество дней)?

705

Я вижу, что на этот вопрос ответил Java, JavaScript и PHP, но не С#. Итак, как можно вычислить количество дней между двумя датами в С#?

  • 5
    Я нашел это довольно полезным на самом деле ... получение списка дат между датой начала и датой окончания Надеюсь, это поможет любому, кто ищет это, в частности, в будущем :)
  • 0
    Операторы сложения и вычитания перегружены для типов DateTime и TimeSpan как и следовало ожидать. Это все довольно просто. - С какой именно проблемой вы столкнулись?
Теги:
date

15 ответов

1398
Лучший ответ

Предполагая, что StartDate и EndDate имеют тип DateTime:

(EndDate - StartDate).TotalDays
  • 472
    Этот ответ, очевидно, правильный, но вы также можете использовать (a - b).Days если вас интересует общее количество дней как int а не как double с десятичным представлением частичной разницы в днях.
  • 22
    это вернет 1 меньше дней, 08/31 / 2013-08 / 01/2013 = 31, но это вернет только 30.
Показать ещё 9 комментариев
101

Использовать объект TimeSpan, который является результатом вычитания даты:

DateTime d1;
DateTime d2;
return (d1 - d2).TotalDays;
  • 2
    Голосование происходит просто потому, что ясно, что (d1 - d2) вернет объект TimeSpan.
  • 2
    Удивительная разница в ответе через 1 минуту может повлиять на ваши положительные голоса.
38

Я думаю, что это сделает то, что вы хотите:

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

TimeSpan t = d1 - d2;
double NrOfDays = t.TotalDays;
35

Верхний ответ правильный, однако, если вы хотите, чтобы только WHOLE days были int и с удовольствием отказались от компонента времени в дате, подумайте:

(EndDate.Date - StartDate.Date).Days

Опять же, если StartDate и EndDate имеют тип DateTime.

  • 5
    Лучший ответ, потому что «число дней» обычно означает целые дни. Стоит отметить, что Days не останавливается на 365 (как и другие свойства, такие как Hours , Minutes , Second значение nax, где начинается следующее более высокое свойство). Это так же, как TotalDays но без дробей дня и возвращает int вместо double .
  • 0
    Будет ли это всегда работать, как ожидалось? Например, если одним из сравниваемых дней является день перехода на летнее время «впереди весны», может ли вычитание создать интервал времени в 23 часа, и если это так, будет ли значение .Days в этом 23-часовом интервале времени равно 0 ? (Я сам пытался поэкспериментировать с этим, но мои результаты пока безрезультатны - stackoverflow.com/questions/43644252/… )
Показать ещё 3 комментария
31
DateTime xmas = new DateTime(2009, 12, 25);
double daysUntilChristmas = xmas.Subtract(DateTime.Today).TotalDays;
  • 1
    В любом случае, чтобы получить промежуточные дни в формате DateTime? Потому что мне нужно, чтобы каждая дата изменяла определенное поле в таблицах :) Редактировать: Получил и отправил как ответ ниже. Спасибо
  • 4
    DateTime xmas = new DateTime (DateTime.Today.Year, 12, 25); заставил бы это работать на ежегодной основе, а не только 2009 :)
Показать ещё 1 комментарий
14

Если кто-то хочет, чтобы число целых дней было двойным (a, b типа DateTime):

 (a.Date - b.Date).TotalDays
  • 2
    Хотя это всегда будет целое число (т. Е. N.00000), потому что часть Date всегда полночь.
6

Вы можете попробовать это

EndDate.Date.Subtract(DateTime.Now.Date).Days
  • 1
    Это действительно помогло мне лучше всего, поскольку моя разница в датах составляла полдня, но, тем не менее, когда Америка на 1 день отстает от Австралии, я должен видеть, что на самом деле разница в один день. Другие ответы, упомянутые в этой теме, показывали либо ноль, либо некоторое двойное число ниже 1, которое мне не нужно.
3
// 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

Вы также можете получить разницу в секундах, миллисекундах и тиках.

1

Для 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

Для начинающих, таких как я, которые наткнутся на эту крошечную проблему, в простой строке, с преобразованием образца в int:

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

Это вычисляет общие дни с сегодняшнего дня (DateTime.UtcNow.Date) до нужной даты (myDateTime.Date).

Если myDateTime вчера или старше, чем сегодня, это даст положительный результат (+).

С другой стороны, если myDateTime будет завтра или в будущей дате, это даст отрицательный (-) целочисленный результат из-за правил добавления.

Счастливое кодирование! ^ _ ^

0

Использование timespan решит проблемы, поскольку у него много атрибутов:

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

Вы можете использовать следующий код:

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

Получите разницу между двумя датами, а затем получите дни от:

int total_days = (EndDate - StartDate).TotalDays
  • 0
    Хотя этот фрагмент кода может решить вопрос, в том числе объяснение действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин, по которым вы предлагаете код. Также постарайтесь не переполнять ваш код пояснительными комментариями, так как это снижает удобочитаемость кода и пояснений!
  • 1
    TotalDays возвращает двойное значение: msdn.microsoft.com/en-us/library/… Так что вам нужно преобразование в int
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();
}

Используйте кнопочный элемент управления для вызова вышеуказанного класса. Вот пример:

-16
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;
    }
}   
  • 20
    Этот код неверен во многих отношениях! 1) Много кода Winforms, не связанного с вопросом. 2) Проводной способ отображения окон сообщений с использованием (я думаю, элемент управления WebBrowser). 3) использование элемента управления WebBrowser для отображения текста, который уже отображается в метке. 4) Использование OperatorOverload Subtract () (по умолчанию для операций «-»), которое используется в любом случае, если вы делаете «MyDateA - MyDateB». 5) Нет объяснения этой куче кода.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню