2011-02-24 7 views
2

J'ai un journal des entrées et sorties. Je veux avoir une colonne dans le journal soit le temps total pendant une connexion et à côté de cela le temps total de connexion pour cette personne pour le journal entier.C# DateHeure Durée Durée?

je reçois la première durée en utilisant l'objet TimeSpan, mais d'additionner sans cesse le temps total pendant que je désabonnement à travers le jeu de résultats m'a échappé:

// Set duration of this visit 
timeInRoom = -(ieLog.Ingresstime - ieLog.Egresstime); 

J'ai essayé d'avoir une autre TimeSpan variable pour contenir la valeur de la dernière itération et ajouter timeInRoom à cela afin que je puisse avoir un compte courant, mais cela ne semble pas fonctionner.

Je devine que je vais à ce sujet dans le mauvais sens. Des idées? Les heures sont des valeurs DateTime dans le jeu de résultats.

Merci.

+0

comment ajoutez-vous vos objets timespan? – msarchet

+0

J'ajoute des objets DateTime, mais quand je l'ai fait, le résultat était un objet TimeSpan. – rd42

+0

N'ajoutez pas deux DateTimes, voir mon exemple ci-dessous pour savoir comment les garder droites. –

Répondre

4

Quelque chose comme cela devrait fonctionner:

var timeInRoom = new TimeSpan(); 
foreach(var log in logs) 
{ 
    timeInRoom += log.Egresstime - log.IngressTime; 
} 

Ou si vous êtes fan de LINQ:

logs.Aggregate(new TimeSpan(), 
       (ts, log) => ts + (log.Egresstime - log.IngressTime)); 
+0

Pourquoi utilisez-vous var timeInRoom, au lieu de TimeSpan timeInRoom? – rd42

+0

@ rd42: C'est juste une question de style. Quelqu'un qui regarde cette ligne peut voir immédiatement que timeInRoom est un TimeSpan (à cause de comment il est initialisé), donc il n'y a pas beaucoup de risque de confusion de la part des développeurs. Le compilateur le traite exactement de la même façon. Je préfère donc éviter les répétitions vaines ('TimeSpan ... = new TimeSpan()'). – StriplingWarrior

4

Essayez de DateTime séparés et des concepts TimeSpan dans votre tête. Les TimeSpans représentent une durée fixe indépendamment du moment où elle s'est produite ou s'est produite. C'est juste un nombre avec une unité. DateTime représente un temps fixe dans l'espace avec une valeur définie par rapport à maintenant.

Par exemple:

DateTime now = DateTime.Now; 
DateTime tomorrow = now.AddDays(1); 
DateTime yesterday = now.AddDays(-1); 
DateTime nextWeek = now.Add(TimeSpan.FromDays(7)); 
DateTime dayAfterNext = now.Add(TimeSpan.FromDays(1) + TimeSpan.FromDays(1)); 

TimeSpan twoDays = TimeSpan.FromDays(1) + TimeSpan.FromDays(1); 
TimeSpan oneMinute = TimeSpan.FromMinutes(2) - TimeSpan.FromMinutes(1); 
DateTime oneMinuteFromNow = now.Add(oneMinute); 

@StriplingWarrior de » réponse démontre bien comment garder un total en cours d'exécution du temps écoulé.

+0

Merci pour l'explication! – rd42