2011-02-09 16 views
131

Pobieram dwie wartości daty z bazy danych. Po pobraniu wartości potrzebuję różnicy między tymi dwiema wartościami. W tym celu utworzę zmienną przedziału czasowego, aby zapisać różnicę dwóch wartości daty.Wyświetlanie Różnica między dwiema wartościami datetime w godzinach

TimeSpan? variable = datevalue1 - datevalue2; 

Teraz muszę pokazać różnicę, która jest przechowywana w zmiennej Czas trwania pod względem liczby godzin. Odniosłem się do TimeSpan.TotalHours, ale nie mogłem zastosować tego samego z jakiegoś powodu. Jak to zrobić? Używam C# w projekcie MVC. Po prostu muszę pokazać wartość różnicy w godzinach?

EDYCJA: Ponieważ przedział czasowy był zerowy, nie mogłem użyć całkowitej liczby godzin. Teraz mogę go używać, wykonując TimeSpanVal.Value.TotalHours;

+3

Dlaczego nie nie używasz 'TimeSpan.TotalHours'? –

+0

to nie pozwala mi. próbowałem. :( – reggie

+0

czy to dlatego, że mój przedział czasowy jest zerowy, że nie mogę użyć własności totalhours? – reggie

Odpowiedz

96

Myślę, że jesteś zdezorientowany, ponieważ nie zadeklarowałeś TimeSpan zadeklarowałeś TimeSpan?, który jest nullableTimeSpan. Usuń znak zapytania, jeśli nie chcesz, aby był on zerowy lub użyj variable.Value.TotalHours.

57

W próbie tworzymy dwa obiekty datetime, jeden z bieżącym czasem i drugi z 75 sekundami dodanymi do bieżącego czasu. Następnie wywołamy metodę .Subtitle() na drugim obiekcie DateTime. Spowoduje to zwrócenie obiektu TimeSpan. Po uzyskaniu obiektu TimeSpan możemy użyć właściwości TimeSpan, aby uzyskać aktualne 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 (s): 15 Różnica czasowa (w minutach): 1 Różnica czasowa (w godzinach): 0 Różnica czasowa (dni) 0

+18

Chcesz użyć "Total", takich jak 'TotalSeconds',' TotalMinutes' itp. –

36

Czy istnieje powód, dla którego używasz Nullable?

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

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

+0

Prawdopodobnie ponieważ datevalue1 lub datevalue2 to 'DateTime?' –

+0

@Filip, wszystko w porządku, powinny to być 'DateTime'. W .NET: 'DateTime - DateTime = TimeSpan'. –

+1

@Illya, mam na myśli to, że prawdopodobnie są 'Nullable ' i dlatego otrzymujesz 'Nullable '. –

125

można również zajrzeć do

var hours = (datevalue1 - datevalue2).TotalHours; 
+0

, ale w tym przypadku system pokazuje "System.Nullable " nie zawiera definicji "TotalHours" ani metody rozszerzenia "TotalHours" akceptującej pierwszy argument typu "System.Nullable " może zostać znalezione ". Czy możesz mi powiedzieć, dlaczego? – Neha

+5

Nullable będzie potrzebować wartości .Value.TotalHours zamiast just .TotalHours. Jest to czynnik owijania zerowego. Alternatywnie można go rzucić jako przedział czasowy -> ((TimeSpan) (nullabledateue1 - nullabledatevalue2)). – MarkKGreenway

5

Oto kolejny przykład odejmując dwie daty w C# ...

if (DateTime.Now.Subtract(Convert.ToDateTime(objDateValueFromDatabase.CreatedOn)).TotalHours > 24) 
{ 
... 
} 
0
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żna również dodać różnicę między datami gdybyśmy porównaj dwie różne daty:

new TimeSpan(24 * days, 0, 0) 
Powiązane problemy