Был бы признателен, если кто-нибудь может помочь мне разобраться, чтобы выровнять 2 поля datetime, чтобы получить разницу в леях.
Вычесть 2 поля datetime, чтобы получить разницу в леях
Ответ 1
Это очень легко сделать с С#. Для сравнения DateTimes у нас есть класс под названием TimeSpan. Структура TimeSpan в этом случае будет определяться как как разница между двумя датами времени.
Скажем, что ваши DateTimes называются началом и концом.
DateTime start = new DateTime(2009, 6, 14);
DateTime end = new DateTime(2009, 12, 14);
Мы установили наши DateTimes до 14 июня 2009 года и 14 декабря 2009 года.
Теперь найдите разницу между ними. Для этого мы создаем TimeSpan:
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 (особенно примеры С#).
Надеюсь, я помог!
ОБНОВЛЕНИЕ:. В некоторых ответах предлагается сделать вычитание за один шаг, например:
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:
Возвращает наименьшее интегральное значение что больше или равно заданная двойная точность число с плавающей запятой.
Как вы хотите подсчитать дни?
Таким образом, мы теперь имеем проблему с тем, как вы хотите подсчитать дни. Вы хотите считать часть дня (например, 0,5 дня) следующим образом:
- Полный день - это будет использовать Math.Ceiling для округления TimeSpan.TotalDays, так что вы рассчитываете начатые дни.
- Часть дня - вы можете просто вернуть TimeSpan.TotalDays(не округленный) как десятичный (в двойном типе данных)
- Nothing - вы можете игнорировать эту часть дня и просто вернуть 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.
Ответ 2
Использование
DateTime departure = new DateTime(2010, 6, 12, 18, 32, 0);
DateTime arrival = new DateTime(2010, 6, 13, 22, 47, 0);
TimeSpan travelTime = arrival - departure;
Ответ 3
Самый простой выход - использование TimeSpan(). Эта функция Subtract вернет вам разницу между двумя датами в терминах временного интервала. Теперь вы можете получать поля, такие как дни, месяцы и т.д. Чтобы получить доступ к дням, вы можете использовать Вот пример кода;
код 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
С#.Net code;
DateTime lDate1;
DateTime lDate2;
TimeSpan tsTimeSpan ;
int NumberOfDays;
//Initialize date variables here
tsTimeSpan = ldDate1 .Subtract(ldDate2);
NumberOfDays = tsTimeSpan.days;
Ответ 4
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;
Ответ 5
Разница между днями
Эти ответы принимают количество дней как int
из структуры System.TimeSpan
, которая является результатом вычитания двух полей System.DateTime
...
Быстрый ответ - количество разностей дней.
int numDaysDiff = date2.Subtract(date1).Days;
Альтернативный ответ - использует Math.Abs, чтобы гарантировать, что это не отрицательное число, на всякий случай, если даты могут быть предоставлены в любом порядке.
int numDaysDiff = Math.Abs( date2.Subtract(date1).Days );
Некоторые примеры данных, чтобы завершить его using System
namespace:
// sample data
DateTime date1 = DateTime.Now;
DateTime date2 = DateTime.Now.AddDays(10);
Ссылки MSDN (и более пример кода):
Ответ 6
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
Вероятно, вы захотите этого в сценарии, например
- Отправить уведомление по электронной почте 14 дней до истечения срока действия
- Отправить еще одно уведомление по электронной почте через 14 дней после истечения срока действия
Вам нужна разница, которая может быть отрицательным значением
Ответ 7
Вы должны посмотреть TimeSpan.
Ответ 8
Чтобы получить точные дни, игнорирующие временной раздел
DateTime d1 = Convert.ToDateTime(DateTime.Now.ToShortDateString());
DateTime d2 = Convert.ToDateTime(DateTime.Now.AddDays(46).ToShortDateString());
var days = Convert.ToInt32(d2.Subtract(d1).TotalDays)