Отображение разницы между двумя значениями даты и времени в часах

186

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

TimeSpan? variable = datevalue1 - datevalue2;

Теперь мне нужно показать разницу, которая хранится в переменной Timespan с точки зрения количества часов. Я сослался на TimeSpan.TotalHours, но по какой-то причине не смог применить то же самое. Как я могу это сделать? Я использую C # в проекте MVC. Мне просто нужно показать разницу в часах?

РЕДАКТИРОВАТЬ: Так как временной интервал был обнуляемым, я не мог использовать общее количество часов. Теперь я могу использовать его, выполнив TimeSpanVal.Value.TotalHours ;

Реджи
источник
3
Почему ты не можешь использовать TimeSpan.TotalHours?
Фредрик Мёрк
это не позволяет мне. Я попытался. :(
Реджи
это потому, что мой временной интервал обнуляется, что я не могу использовать свойство totalhours?
Реджи
4
См. Пример разницы между датой и
у объекта TimeSpan общее количество часов.Value.TotalHours
smurtagh,

Ответы:

119

Я думаю , вы путать , потому что вы не объявлены , TimeSpanвы объявлен TimeSpan?что является обнуляемым TimeSpan . Либо уберите знак вопроса, если вам не нужно, чтобы он был обнуляемым, либо используйте его variable.Value.TotalHours.

Ханс Олссон
источник
197

Вы также можете посмотреть на

var hours = (datevalue1 - datevalue2).TotalHours;
MarkKGreenway
источник
но в этом случае система показывает, что «System.Nullable <System.TimeSpan>» не содержит определения для «TotalHours», и никакой метод расширения «TotalHours», принимающий первый аргумент типа «System.Nullable <System.TimeSpan>», не может быть найденным ". Подскажите, пожалуйста, причину этого?
Неха
8
Nullable потребуется .Value.TotalHours вместо просто .TotalHours. Это фактор обнуляемой упаковки. В качестве альтернативы вы можете привести его в качестве временного
интервала
90

В этом примере мы создаем два объекта datetime, один с текущим временем, а другой с 75 секундами, добавленными к текущему времени. Затем мы вызовем метод .Subtract () для второго объекта DateTime. Это вернет объект TimeSpan. Как только мы получим объект TimeSpan, мы можем использовать свойства TimeSpan, чтобы получить фактические часы, минуты и секунды.

DateTime startTime = DateTime.Now;

 DateTime endTime = DateTime.Now.AddSeconds( 75 );

 TimeSpan span = endTime.Subtract ( startTime );
 Console.WriteLine( "Time Difference (seconds): " + span.Seconds );
 Console.WriteLine( "Time Difference (minutes): " + span.Minutes );
 Console.WriteLine( "Time Difference (hours): " + span.Hours );
 Console.WriteLine( "Time Difference (days): " + span.Days );

Результат:

Time Difference (seconds): 15
Time Difference (minutes): 1
Time Difference (hours): 0
Time Difference (days): 0
Safi
источник
30
Вы хотите использовать "Всего", например TotalSeconds, и TotalMinutesт.д
Филип Экберг
38

Есть ли причина, которую вы используете Nullable?

Если вы хотите использовать, Nullableто вы можете написать variable.Value.TotalHours.

Или вы можете просто написать: (datevalue1 - datevalue2).TotalHours.

Илья Коган
источник
Вероятно, потому что datevalue1 или datevalue2DateTime?
Филип Экберг
@Filip, все в порядке, они должны быть DateTime. В .NET DateTime - DateTime = TimeSpan.
Илья Коган
1
@ Илья, я имею в виду, что они, вероятно, Nullable<DateTime>и поэтому вы получаете Nullable<TimeSpan>.
Филипп Экберг
Ваш ответ действительно эффективен. Я искал это.
gdmanandamohon
7

Вот еще один пример вычитания двух дат в C # ...

if ( DateTime.Now.Subtract(Convert.ToDateTime(objDateValueFromDatabase.CreatedOn)).TotalHours > 24 ) 
{ 
... 
} 
Марио Левеск
источник
3

более точный способ оплаты сотрудником часов или других требований к точности :

decimal DeterminePreciseHours(DateTime startTimestamp, DateTime stopTimestamp)
{
    var span = (stopTimestamp - startTimestamp).Value;
    decimal total = (decimal)span.TotalMilliseconds / 60 / 60 / 1000;
    return Math.Round(total, PRECISION_CONSTANT);
}

https://dotnetfiddle.net/tVIoVJ

smurtagh
источник
1
var startTime = new TimeSpan(6, 0, 0); // 6:00 AM
var endTime = new TimeSpan(5, 30, 0); // 5:30 AM 
var hours24 = new TimeSpan(24, 0, 0);
var difference = endTime.Subtract(startTime); // (-00:30:00)
difference = (difference.Duration() != difference) ? hours24.Subtract(difference.Duration()) : difference; // (23:30:00)

также можно добавить разницу между датами, если мы сравним две разные даты

new TimeSpan(24 * days, 0, 0)
Балахандар Паланисами
источник
0

ВАУ, я должен сказать: будь проще:

MessageBox.Show("Result: " + (DateTime.Now.AddDays(10) > DateTime.Now));

Result: True

и:

MessageBox.Show("Result: " + DateTime.Now.AddDays(10).Subtract(DateTime.Now));

Result: 10.00:00:00

Объект DateTime имеет всю встроенную логику для обработки логического результата.

Расти Наиль
источник