2011-02-24 142 views
2

我有進出時間的日誌。我想在日誌中有一列是一次登錄期間的總時間,並且是該人員在整個日誌中的總登錄時間。C#DateTime TimeSpan持續時間?

我一直在使用的時間間隔對象獲得的第一時間,但在結果集中,而我翻騰不斷加起來的總時間一直困擾我:

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

我已經試過有另一種時間跨度變量來保存最後一次迭代的值,並添加timeInRoom,以便我可以有一個運行的計數器,但這似乎不工作。

我在猜測我是以這種錯誤的方式去做的。有任何想法嗎?時間是結果集中的DateTime值。

謝謝。

+0

你如何添加你的時間跨度對象? – msarchet 2011-02-24 16:34:54

+0

我添加了DateTime對象,但是當我這樣做時,結果是TimeSpan對象。 – rd42 2011-02-24 16:38:51

+0

請勿添加兩個日期時間,請參閱我的示例以瞭解如何保持直線。 – 2011-02-24 17:29:42

回答

4

像這樣的東西應該工作:

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

或者如果你LINQ的粉絲:

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

爲什麼使用var timeInRoom而不是TimeSpan timeInRoom? – rd42 2011-02-24 18:12:00

+0

@ rd42:這只是一個風格問題。有人看着那條線可以立即看到那個timeInRoom是一個TimeSpan(因爲它是如何被初始化的),所以開發人員沒有太多混淆的機會。編譯器對待它完全一樣。所以我寧願避免不必要的重複('TimeSpan ... = new TimeSpan()')。 – StriplingWarrior 2011-02-24 18:26:35

4

嘗試在你的腦袋分開DateTime和時間跨度的概念。時間跨度代表一個固定的時間量,不論它何時發生或發生。這只是一個單位的數字。相對於現在,DateTime代表了一個固定的空間時間值,並具有確定的值。

例如:

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的回答正確演示瞭如何保持運行總時間的流逝。

+0

感謝您的解釋! – rd42 2011-02-24 18:11:30