Affichage de la différence entre deux valeurs datetime en heures

190

Je récupère deux valeurs de date et d'heure de la base de données. Une fois la valeur récupérée, j'ai besoin de la différence entre les deux valeurs. Pour cela, je crée une variable de durée pour stocker la différence des 2 valeurs de date.

TimeSpan? variable = datevalue1 - datevalue2;

Maintenant, je dois montrer la différence qui est stockée dans la variable Timespan en termes de nombre d'heures. J'ai fait référence à TimeSpan.TotalHours mais je n'ai pas pu appliquer la même chose pour une raison quelconque. Comment je fais ça? J'utilise C # sur un projet MVC. J'ai simplement besoin d'afficher la valeur de la différence en heures?

EDIT: Puisque la durée était nullable, je ne pouvais pas utiliser la propriété total des heures. Maintenant, je peux l'utiliser en faisant TimeSpanVal.Value.TotalHours ;

Reggie
la source
3
Pourquoi ne pourriez-vous pas utiliser TimeSpan.TotalHours?
Fredrik Mörk
cela ne me permet pas. j'ai essayé. :(
reggie
est-ce parce que ma durée est nullable que je ne peux pas utiliser la propriété totalhours?
reggie
4
Voir exemple de différence entre les dates
l'objet TimeSpan a un total d'heures en.Value.TotalHours
smurtagh

Réponses:

121

Je pense que vous êtes confus parce que vous n'avez pas déclaré un TimeSpanvous avez déclaré un TimeSpan?qui est nullable TimeSpan . Supprimez le point d'interrogation si vous n'en avez pas besoin pour qu'il soit nullable ou utilisez variable.Value.TotalHours.

Hans Olsson
la source
202

vous voudrez peut-être aussi regarder

var hours = (datevalue1 - datevalue2).TotalHours;
MarkKGreenway
la source
mais dans ce cas, le système montre que "'System.Nullable <System.TimeSpan>' ne contient pas de définition pour 'TotalHours' et aucune méthode d'extension 'TotalHours' acceptant un premier argument de type 'System.Nullable <System.TimeSpan>' ne pourrait être trouvé ". Pouvez-vous m'en dire la raison?
Neha
8
Nullable aurait besoin d'un .Value.TotalHours au lieu de seulement .TotalHours. C'est un facteur du wrapping nullable. Vous pouvez également le caster en tant que période -> ((TimeSpan) (nullabledatevalue1
nullabledatevalue2
93

Dans l'exemple, nous créons deux objets datetime, l'un avec l'heure actuelle et l'autre avec 75 secondes ajoutées à l'heure actuelle. Ensuite, nous appellerons la méthode .Subtract () sur le deuxième objet DateTime. Cela renverra un objet TimeSpan. Une fois que nous obtenons l'objet TimeSpan, nous pouvons utiliser les propriétés de TimeSpan pour obtenir les heures, minutes et secondes réelles.

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

Résultat:

Time Difference (seconds): 15
Time Difference (minutes): 1
Time Difference (hours): 0
Time Difference (days): 0
safi
la source
30
Vous voulez utiliser "Total" tel que TotalSeconds, TotalMinutesetc
Filip Ekberg
39

Y a-t-il une raison pour laquelle vous utilisez Nullable?

Si vous souhaitez utiliser, Nullablevous pouvez écrire variable.Value.TotalHours.

Ou vous pouvez simplement écrire: (datevalue1 - datevalue2).TotalHours.

Ilya Kogan
la source
Probablement parce que datevalue1 ou datevalue2 sontDateTime?
Filip Ekberg
@Filip, c'est bon, ils devraient l'être DateTime. Dans .NET, DateTime - DateTime = TimeSpan.
Ilya Kogan le
1
@Illya, je veux dire qu'ils sont probablement Nullable<DateTime>et donc vous obtenez un Nullable<TimeSpan>.
Filip Ekberg le
Votre réponse est vraiment efficace. Je le cherchais.
gdmanandamohon
7

Voici un autre exemple de soustraction de deux dates en C # ...

if ( DateTime.Now.Subtract(Convert.ToDateTime(objDateValueFromDatabase.CreatedOn)).TotalHours > 24 ) 
{ 
... 
} 
Mario Levesque
la source
3

un moyen plus précis pour les heures rémunérées par les employés ou toute autre exigence de précision ::

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
la source
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)

peut également ajouter une différence entre les dates si nous comparons deux dates différentes

new TimeSpan(24 * days, 0, 0)
Balachandar Palanisamy
la source
0

WOW, je dois dire: restez simple:

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

Result: True

et:

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

Result: 10.00:00:00

L'objet DateTime a toute la logique intégrée pour gérer le résultat booléen.

2 tours
la source