Pokazuje różnicę między dwiema wartościami datetime w godzinach

186

Pobieram dwie wartości daty i godziny z bazy danych. Po odzyskaniu wartości potrzebuję różnicy między tymi dwiema wartościami. W tym celu tworzę zmienną przedziału czasu, aby przechowywać różnicę między 2 wartościami daty.

TimeSpan? variable = datevalue1 - datevalue2;

Teraz muszę pokazać różnicę przechowywaną w zmiennej Timespan pod względem liczby godzin. Odniosłem się do TimeSpan.TotalHours, ale z jakiegoś powodu nie mogłem zastosować tego samego. W jaki sposób mogę to zrobić? Używam C # w projekcie MVC. Po prostu muszę pokazać wartość różnicy w godzinach?

EDYCJA: Ponieważ przedział czasowy był zerowalny, nie mogłem użyć właściwości total hours. Teraz mogę z niego korzystać, wykonując TimeSpanVal.Value.TotalHours ;

reggie
źródło
3
Dlaczego nie mogłeś użyć TimeSpan.TotalHours?
Fredrik Mörk
nie pozwala mi na to. próbowałem. :(
reggie
czy to dlatego, że mój przedział czasu jest zerowy, że nie mogę użyć właściwości totalhours?
reggie
4
Zobacz przykład różnicy czasu, różnicy godzin, różnicy minut na codegateway.com/2012/01/c-datetime-difference.html
obiekt TimeSpan ma łączną liczbę godzin.Value.TotalHours
smurtagh

Odpowiedzi:

119

Myślę, że jesteś zdezorientowany, ponieważ nie zadeklarowałeś TimeSpandeklaracji, TimeSpan?która jest zerowalna TimeSpan . Usuń znak zapytania, jeśli nie potrzebujesz go zerować lub użyć variable.Value.TotalHours.

Hans Olsson
źródło
197

możesz też na to spojrzeć

var hours = (datevalue1 - datevalue2).TotalHours;
MarkKGreenway
źródło
ale w tym przypadku system pokazuje, że „System.Nullable <System.TimeSpan>” nie zawiera definicji „TotalHours” i żadna metoda rozszerzenia „TotalHours” nie akceptuje pierwszego argumentu typu „System.Nullable <System.TimeSpan>” być znalezionym ". Czy możesz mi powiedzieć, dlaczego?
Neha
8
Nullable potrzebowałoby .Value.TotalHours zamiast tylko .TotalHours. Jest to czynnik opakowania zerowalnego. Możesz też rzutować go jako przedział czasu -> ((TimeSpan) (nullabledatevalue1 - nullabledatevalue2)). TotalHours
MarkKGreenway
90

W tym przykładzie tworzymy dwa obiekty daty i godziny, jeden z bieżącym czasem, a drugi z 75 sekundami dodanymi do bieżącego czasu. Następnie wywołamy metodę .Subtract () na drugim obiekcie DateTime. Zwróci to obiekt TimeSpan. Gdy otrzymamy obiekt TimeSpan, możemy użyć właściwości TimeSpan, aby uzyskać rzeczywiste godziny, minuty i sekundy.

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 );

Wynik:

Time Difference (seconds): 15
Time Difference (minutes): 1
Time Difference (hours): 0
Time Difference (days): 0
safi
źródło
30
Chcesz użyć "Total", takich jak TotalSeconds, TotalMinutesetc
Filip Ekberg
38

Czy jest jakiś powód, którego używasz Nullable?

Jeśli chcesz użyć Nullable, możesz pisać variable.Value.TotalHours.

Albo można po prostu napisać: (datevalue1 - datevalue2).TotalHours.

Ilya Kogan
źródło
Prawdopodobnie dlatego, że datevalue1 lub datevalue2 toDateTime?
Filip Ekberg
@Filip, w porządku, powinny być DateTime. W .NET DateTime - DateTime = TimeSpan.
Ilya Kogan
1
@Illya, mam na myśli, że są prawdopodobnie Nullable<DateTime>i dlatego dostajesz Nullable<TimeSpan>.
Filip Ekberg,
Twoja odpowiedź jest naprawdę skuteczna. Szukałem tego.
gdmanandamohon
7

Oto kolejny przykład odejmowania dwóch dat w C # ...

if ( DateTime.Now.Subtract(Convert.ToDateTime(objDateValueFromDatabase.CreatedOn)).TotalHours > 24 ) 
{ 
... 
} 
Mario Levesque
źródło
3

bardziej precyzyjny sposób na godziny płatne przez pracownika lub inne wymagania dotyczące precyzji :

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
źródło
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)

możemy również dodać różnicę między datami, jeśli porównamy dwie różne daty

new TimeSpan(24 * days, 0, 0)
Balachandar Palanisamy
źródło
0

WOW, muszę powiedzieć: zachowaj prostotę:

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

Result: True

i:

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

Result: 10.00:00:00

Obiekt DateTime ma całą wbudowaną logikę do obsługi wyniku logicznego.

Rusty Nail
źródło