вычтите 2 поля даты и времени, чтобы получить разницу в днях - PullRequest
30 голосов
/ 15 декабря 2009

Буду признателен, если кто-нибудь поможет мне вычесть 2 поля даты и времени, чтобы получить разницу в оставшихся днях.

Ответы [ 8 ]

80 голосов
/ 15 декабря 2009

Это очень легко сделать с помощью C #. Для сравнения DateTimes у нас есть класс с именем TimeSpan . Структура TimeSpan в этом случае будет определена как как разница между вашими двумя датами .

Допустим, ваши DateTime называются start и end.

DateTime start = new DateTime(2009, 6, 14);
DateTime end = new DateTime(2009, 12, 14);

Мы установили наши DateTimes на 14 июня 2009 г. и 14 декабря 2009 г.

Теперь давайте найдем разницу между ними. Для этого мы создаем интервал времени:

TimeSpan difference = end - start;

С помощью этого объекта TimeSpan вы можете выразить разницу во времени различными способами. Тем не менее, вы специально просили разницу в днях, так что вот как вы можете это получить:

Console.WriteLine("Difference in days: " + difference.Days);

Таким образом, свойство называется TimeSpan.Days .


Финальный код

//establish DateTimes
DateTime start = new DateTime(2009, 6, 14);
DateTime end = new DateTime(2009, 12, 14);

TimeSpan difference = end - start; //create TimeSpan object

Console.WriteLine("Difference in days: " + difference.Days); //Extract days, write to Console.

Дополнительные сведения об использовании структуры TimeSpan см. В этой документации MSDN (особенно в примерах C #).

Надеюсь, я помог!

ОБНОВЛЕНИЕ: В некоторых ответах предлагается выполнить вычитание за один шаг, например, с помощью:

int days = (dt2 - dt1).Days;

или

int numDaysDiff = Math.Abs(date2.Subtract(date1).Days);

Однако они такие же, как в моем ответе, только сокращенные. Это связано с тем, что метод DateTime.Subtract () и оператор вычитания DateTimes возвращают TimeSpan , из которого вы можете получить доступ к количеству дней. Я специально использовал более длинный подход в моем примере кода, чтобы вы четко понимали, что происходит между вашими объектами DateTime и TimeSpan и как все это работает. Конечно, другие подходы, которые я только что упомянул, тоже подойдут.

ОБНОВЛЕНИЕ № 2:

Очень похожий вопрос задавался ранее, и его можно найти здесь . Однако основной смысл этого вопроса заключался в том, почему образец кода (который по существу эквивалентен тому из всех ответов) иногда дает ответ, который является выходным. Я думаю, что это также важно для этого вопроса.

Как следует из основного ответа на другой вопрос, вы можете использовать этот код:

int days = (int)Math.Ceiling(difference.TotalDays);

В этом коде используется Math.Ceiling, который, согласно MSDN, имеет вид:

Возвращает наименьшее целое значение это больше или равно указанная двойная точность число с плавающей точкой.

Как вы хотите считать дни?

Таким образом, у нас теперь есть проблема с тем, как вы хотите считать дни . Вы хотите считать часть дня (например, .5 дня) как:

  • Полный день - при этом Math.Ceiling будет округлять TimeSpan.TotalDays, так что вы будете считать начальные дни.
  • Часть дня - вы можете просто вернуть TimeSpan.TotalDays (без округления) в виде десятичной дроби (в двойном типе данных)
  • Ничего - вы можете игнорировать эту часть дня и просто вернуть TimeSpan.Days.

Вот примеры кода для вышеуказанного:

Подсчет за полный день (используя Math.Ceiling () для округления):

//establish DateTimes
DateTime start = new DateTime(2009, 6, 14);
DateTime end = new DateTime(2009, 12, 14);

TimeSpan difference = end - start; //create TimeSpan object

int days = (int)Math.Ceiling(difference.TotalDays); //Extract days, counting parts of a day as a full day (rounding up).

Console.WriteLine("Difference in days: " + days); //Write to Console.

Подсчет как часть дня (НЕ используя Math.Ceiling (), вместо этого оставляя в десятичной форме как часть дня):

//establish DateTimes
DateTime start = new DateTime(2009, 6, 14);
DateTime end = new DateTime(2009, 12, 14);

TimeSpan difference = end - start; //create TimeSpan object

double days = difference.TotalDays; //Extract days, counting parts of a day as a part of a day (leaving in decimal form).

Console.WriteLine("Difference in days: " + days); //Write to Console.

Подсчет как ничего дня (округление до количества полных дней):

//establish DateTimes
DateTime start = new DateTime(2009, 6, 14);
DateTime end = new DateTime(2009, 12, 14);

TimeSpan difference = end - start; //create TimeSpan object

int days = difference.TotalDays; //Extract days, counting parts of a day as nothing (rounding down).

Console.WriteLine("Difference in days: " + days); //Write to Console.
5 голосов
/ 15 декабря 2009

Используйте

TimeSpan

DateTime departure = new DateTime(2010, 6, 12, 18, 32, 0);
DateTime arrival = new DateTime(2010, 6, 13, 22, 47, 0);
TimeSpan travelTime = arrival - departure;  
4 голосов
/ 15 декабря 2009

Самый простой выход - использование TimeSpan (). Эта функция вычитания вернет вам разницу между двумя датами с точки зрения промежутка времени. Теперь вы можете выбрать такие поля, как дни, месяцы и т. Д. Для доступа к дням вы можете использовать Вот пример кода;

код VB.Net;

    Dim tsTimeSpan As TimeSpan
    Dim ldDate1 as Date
    Dim ldDate2 as Date
      'Initialize date variables here
       tsTimeSpan = ldDate1 .Subtract(ldDate2)
       Dim NumberOfDays as integer = tsTimeSpan.days

C # .Net код;

    DateTime lDate1;
    DateTime lDate2;
    TimeSpan tsTimeSpan ;
    int NumberOfDays;
      //Initialize date variables here
      tsTimeSpan = ldDate1 .Subtract(ldDate2);
      NumberOfDays = tsTimeSpan.days;
2 голосов
/ 10 апреля 2015
DateTime theDate = DateTime.Today;
int datediff = theDate.Subtract(expiryDate).Negate().Days;
if expiryDate > theDate then you get Negative value: -14
expiryDate is less than theDate then you get positive value: 14

Вы, очевидно, хотите этого в сценарии, таком как

  1. Отправить уведомление по электронной почте за 14 дней до истечения срока действия
  2. Отправить еще одно уведомление по электронной почте через 14 дней после истечения срока действия

Вам нужна разница, которая может иметь отрицательное значение

2 голосов
/ 15 декабря 2009

Разница в количестве дней

Эти ответы принимают количество дней как int из структуры System.TimeSpan, которая является результатом вычитания двух System.DateTime полей ...

Быстрый ответ - получает разницу в количестве дней.

        int numDaysDiff = date2.Subtract(date1).Days;

Альтернативный ответ - использует Math.Abs, чтобы убедиться, что это не отрицательное число, на тот случай, если даты могут быть указаны в любом порядке.

        int numDaysDiff = Math.Abs( date2.Subtract(date1).Days );

Некоторые примеры данных для завершения using System Пространство имен:

        // sample data
        DateTime date1 = DateTime.Now;
        DateTime date2 = DateTime.Now.AddDays(10);

Ссылки MSDN (и другие примеры кода):

2 голосов
/ 15 декабря 2009
DateTime dt1 = new DateTime(2009,01,01,00,00,00);
DateTime dt2 = new DateTime(2009,12,31,23,59,59);

int days = (dt2 - dt1).Days;
1 голос
/ 15 декабря 2009

Вы должны посмотреть на TimeSpan .

0 голосов
/ 12 января 2016

Чтобы получить точные дни, игнорируя отрезок времени

    DateTime d1 = Convert.ToDateTime(DateTime.Now.ToShortDateString());
    DateTime d2 = Convert.ToDateTime(DateTime.Now.AddDays(46).ToShortDateString());

    var days = Convert.ToInt32(d2.Subtract(d1).TotalDays)
...