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 .

Reggie
quelle
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.

Hans Olsson
quelle
196

Vielleicht möchten Sie auch schauen

var hours = (datevalue1 - datevalue2).TotalHours;
MarkKGreenway
quelle
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
Safi
quelle
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.

Ilya Kogan
quelle
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 ) 
{ 
... 
} 
Mario Levesque
quelle
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

smurtagh
quelle
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)
Balachandar Palanisamy
quelle
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.

Rusty Nail
quelle