Anzeige des Unterschieds zwischen zwei Datums- / Uhrzeitwerten in Stunden


185

Ich rufe zwei Datums- und Uhrzeitwerte aus der Datenbank ab. Sobald der Wert abgerufen wurde, benötige ich die Differenz zwischen den beiden Werten. Dazu erstelle ich eine Zeitspannenvariable, um die Differenz der beiden Datumswerte zu speichern.

TimeSpan? variable = datevalue1 - datevalue2;

Jetzt muss ich die Differenz, die in der Timespan-Variablen gespeichert ist, in Bezug auf die Anzahl der Stunden anzeigen. Ich habe auf TimeSpan.TotalHours verwiesen , konnte es aber aus irgendeinem Grund nicht anwenden. Wie mache ich das? Ich verwende C # in einem MVC-Projekt. Muss ich einfach den Differenzwert in Stunden anzeigen?

BEARBEITEN: Da die Zeitspanne nullbar war, konnte ich die Eigenschaft "Gesamtstunden" nicht verwenden. Jetzt kann ich es mit TimeSpanVal.Value.TotalHours verwenden .


3
Warum könntest du nicht verwenden TimeSpan.TotalHours?
Fredrik Mörk

es erlaubt mir nicht. Ich habe es versucht. :(
Reggie

Liegt es daran, dass meine Zeitspanne nullbar ist, dass ich die Eigenschaft totalhours nicht verwenden kann?
Reggie

4
Siehe Beispiel für Datums- / Uhrzeitdifferenz, Stundendifferenz, Minutendifferenz auf codegateway.com/2012/01/c-datetime-difference.html

Das TimeSpan-Objekt hat insgesamt Stunden in.Value.TotalHours
smurtagh

Antworten:


118

Ich denke, Sie sind verwirrt, weil Sie nicht deklariert haben, dass Sie eine deklariert TimeSpanhaben, TimeSpan?die nullbar ist TimeSpan . Entfernen Sie entweder das Fragezeichen, wenn es nicht nullwertfähig sein soll, oder verwenden Sie es variable.Value.TotalHours.


196

Vielleicht möchten Sie auch schauen

var hours = (datevalue1 - datevalue2).TotalHours;

In diesem Fall zeigt das System jedoch "'System.Nullable <System.TimeSpan>' enthält keine Definition für 'TotalHours' und keine Erweiterungsmethode 'TotalHours', die ein erstes Argument vom Typ 'System.Nullable <System.TimeSpan>' akzeptiert gefunden werden ". Können Sie mir bitte den Grund dafür nennen?
Neha

8
Nullable würde einen .Value.TotalHours anstelle von nur .TotalHours benötigen. Es ist ein Faktor der nullbaren Umhüllung. Sie können es alternativ als Zeitspanne umwandeln -> ((TimeSpan) (nullabledatevalue1 - nullabledatevalue2)). TotalHours
MarkKGreenway

90

Im Beispiel erstellen wir zwei Datums- / Uhrzeitobjekte, eines mit der aktuellen Zeit und eines mit 75 Sekunden, die zur aktuellen Zeit hinzugefügt werden. Dann rufen wir die Methode .Subtract () für das zweite DateTime-Objekt auf. Dies gibt ein TimeSpan-Objekt zurück. Sobald wir das TimeSpan-Objekt erhalten haben, können wir die Eigenschaften von TimeSpan verwenden, um die tatsächlichen Stunden, Minuten und Sekunden abzurufen.

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

Ergebnis:

Time Difference (seconds): 15
Time Difference (minutes): 1
Time Difference (hours): 0
Time Difference (days): 0

30
Sie wollen „Total“ wie verwenden TotalSeconds, TotalMinutesetc
Filip Ekberg

38

Gibt es einen Grund, den Sie verwenden Nullable?

Wenn Sie verwenden möchten, Nullablekönnen Sie schreiben variable.Value.TotalHours.

Oder Sie können einfach schreiben : (datevalue1 - datevalue2).TotalHours.


Wahrscheinlich, weil Datumswert1 oder Datumswert2 sindDateTime?
Filip Ekberg

@ Filip, es ist in Ordnung, sie sollten es sein DateTime. In .NET , DateTime - DateTime = TimeSpan.
Ilya Kogan

1
@Illya, ich meine, dass sie wahrscheinlich sind Nullable<DateTime>und deshalb bekommst du eine Nullable<TimeSpan>.
Filip Ekberg

Ihre Antwort ist wirklich effektiv. Ich habe danach gesucht.
Gdmanandamohon

7

Hier ist ein weiteres Beispiel für das Subtrahieren von zwei Daten in C # ...

if ( DateTime.Now.Subtract(Convert.ToDateTime(objDateValueFromDatabase.CreatedOn)).TotalHours > 24 ) 
{ 
... 
} 

3

eine genauere Art und Weise für die Mitarbeiter bezahlter Stunden oder anderen Präzisionsbedarf: :

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)

kann auch einen Unterschied zwischen den Daten hinzufügen, wenn wir zwei verschiedene Daten vergleichen

new TimeSpan(24 * days, 0, 0)

0

WOW, ich muss sagen: halte es einfach:

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

Result: True

und:

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

Result: 10.00:00:00

Das DateTime-Objekt verfügt über die gesamte integrierte Logik, um das boolesche Ergebnis zu verarbeiten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.