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 ;


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.


197

możesz też na to spojrzeć

var hours = (datevalue1 - datevalue2).TotalHours;

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

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.


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 ) 
{ 
... 
} 

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


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)

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.