Показано різницю між двома значеннями дати у годинах


186

Я отримую з бази даних два значення часу. Після отримання значення мені потрібна різниця між двома значеннями. Для цього я створюю змінну часового простору, щоб зберігати різницю двох значень дати.

TimeSpan? variable = datevalue1 - datevalue2;

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

EDIT: Оскільки часовий проміжок був нульовим, я не міг використовувати властивість загальної кількості годин. Тепер я можу використовувати його, виконуючи 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. Це фактор нестабільного обгортання. Ви також можете подати його як часовий проміжок -> ((TimeSpan) (nullabledatevalue1 - nullabledatevalue2)). TotalHours
MarkKGreenway

90

У вибірці ми створюємо два об'єкти дати, один з поточним часом та інший із 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тощо
Filip Ekberg

38

Чи є причина, яку ви використовуєте Nullable?

Якщо ви хочете використовувати, Nullableто ви можете написатиvariable.Value.TotalHours .

Або ви можете просто написати: (datevalue1 - datevalue2).TotalHours.


Можливо, тому, що datevalue1 або datevalue2 єDateTime?
Філіп Екберг

@Filip, це нормально, вони повинні бути DateTime. В .NET DateTime - DateTime = TimeSpan.
Ілля Коган

1
@Illya, я маю на увазі, що вони, ймовірно, 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

WOW, я повинен сказати: нехай це буде просто:

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.