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


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;

но в этом случае система показывает, что «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

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


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 имеет всю встроенную логику для обработки логического результата.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.