Mostra la differenza tra due valori datetime in ore


186

Sto recuperando due valori di data e ora dal database. Una volta recuperato il valore, ho bisogno della differenza tra i due valori. Per questo, creo una variabile timepan per memorizzare la differenza dei 2 valori di data.

TimeSpan? variable = datevalue1 - datevalue2;

Ora devo mostrare la differenza memorizzata nella variabile Timespan in termini di numero di ore. Ho fatto riferimento a TimeSpan.TotalHours ma non ho potuto applicare lo stesso per qualche motivo. Come lo faccio? Sto usando C # su un progetto MVC. Devo semplicemente mostrare il valore della differenza in ore?

EDIT: Poiché il periodo di tempo era nullable, non potevo usare la proprietà ore totali. Ora posso usarlo facendo TimeSpanVal.Value.TotalHours ;


3
Perché non potresti usare TimeSpan.TotalHours?
Fredrik Mörk,

non me lo permette. Provai. :(
reggie,

è perché il mio periodo di tempo è nullable che non posso usare la proprietà totalhours?
Reggie,

4
Vedi esempio di differenza di data / ora, differenza di ore, differenza di minuti su codegateway.com/2012/01/c-datetime-difference.html

l'oggetto TimeSpan ha ore totali in.Value.TotalHours
smurtagh,

Risposte:


119

Penso che tu sia confuso perché non hai dichiarato un TimeSpanche hai dichiarato un TimeSpan?che è nullable TimeSpan . Rimuovere il punto interrogativo se non è necessario che sia nullable o utilizzare variable.Value.TotalHours.


197

potresti anche voler guardare

var hours = (datevalue1 - datevalue2).TotalHours;

ma in questo caso il sistema mostra "'System.Nullable <System.TimeSpan>' non contiene una definizione per 'TotalHours' e nessun metodo di estensione 'TotalHours' che accetta un primo argomento di tipo 'System.Nullable <System.TimeSpan>' potrebbe Essere trovato ". Puoi per favore dirmi il motivo?
Neha,

8
Nullable avrebbe bisogno di un .Value.TotalHours anziché solo .TotalHours. È un fattore dell'involucro nullable. In alternativa, puoi lanciarlo come intervallo di tempo -> ((TimeSpan) (nullabledatevalue1 - nullabledatevalue2)). TotalHours
MarkKGreenway

90

Nell'esempio, stiamo creando due oggetti datetime, uno con l'ora corrente e un altro con 75 secondi aggiunti all'ora corrente. Quindi chiameremo il metodo .Subtract () sul secondo oggetto DateTime. Ciò restituirà un oggetto TimeSpan. Una volta ottenuto l'oggetto TimeSpan, possiamo usare le proprietà di TimeSpan per ottenere le ore, i minuti e i secondi effettivi.

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

Risultato:

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

30
Si desidera utilizzare "Totale" come TotalSeconds, TotalMinutesecc.
Filip Ekberg,

38

C'è un motivo che stai usando Nullable?

Se si desidera utilizzare, Nullableè possibile scrivere variable.Value.TotalHours.

Oppure si può solo scrivere: (datevalue1 - datevalue2).TotalHours.


Probabilmente perché datevalue1 o datevalue2 sonoDateTime?
Filip Ekberg,

@Filip, va bene, dovrebbero essere DateTime. In .NET, DateTime - DateTime = TimeSpan.
Ilya Kogan,

1
@Illya, intendo dire che sono probabilmente Nullable<DateTime>e quindi ottieni un Nullable<TimeSpan>.
Filip Ekberg,

La tua risposta è davvero efficace. Lo stavo cercando.
gdmanandamohon,

7

Ecco un altro esempio di sottrazione di due date in C # ...

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

3

un modo più preciso per le ore retribuite dei dipendenti o altri requisiti di precisione :

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)

può anche aggiungere la differenza tra le date se confrontiamo due date diverse

new TimeSpan(24 * days, 0, 0)

0

WOW, devo dire: mantienilo semplice:

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

Result: True

e:

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

Result: 10.00:00:00

L'oggetto DateTime ha tutta la logica incorporata per gestire il risultato booleano.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.