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 ;


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.


202

vous voudrez peut-être aussi regarder

var hours = (datevalue1 - datevalue2).TotalHours;

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

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.


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 ) 
{ 
... 
} 

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


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)

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.