2016-05-13 14 views
-1

Ich versuche, ein Recording Time Label einrichten, so dass, wenn ein Benutzer auf eine Schaltfläche klickt es startet und wenn sie auf eine andere Schaltfläche klicken, stoppt es.berechnen Unterschied in Zeiten über Tage C#

Ich habe zwei verschiedene Dinge ausprobiert, die nicht funktioniert haben.

  1. Einen Ticker setzen und einen Wert um 1 erhöhen und anzeigen.

Das hat nicht funktioniert, wie ich auch andere Dinge in dem Ticker tue, was bedeutet, es 1,5 Sekunden dauern kann, aber ich bin Zuwachs von 1, also je länger die Aufzeichnung auf der mehr geht inaccruate es ist.

  1. gibt es die TimeOfDay, wenn der Strom beginnt und auf der Ticker-Methode, um die TimeOfDay bekommt und sie abgezogen wird.

Das funktioniert nicht, weil, wenn die Aufnahme schaltet sich die Zeit über Nacht in minusen -67.647,74 Sekunden d.h.

private void StreamClick_Click(object obj) 
{ 
    _streamStartTime = DateTime.Now.TimeOfDay; 
} 

private void LiveVideoStream_Tick(VideoCaptureDevice cam) 
{ 
    _currentRecordTime = DateTime.Now.TimeOfDay - _streamStartTime; 
    RecordTime = _currentRecordTime.ToString(); 
} 

Hat jemand irgendwelche anderen Ideen, wie ich einen schönen Timer anzeigen kann.

+0

Verlassen Sie sich nicht nur auf die Zeit, sondern subtrahieren Sie die gesamten DateTimes voneinander. – CodeCaster

+0

'_streamStartTime' sollte auch eine' DateTime' sein, dann weisen Sie sie mit 'DateTime.Now' zu, wenn Sie auf klicken. minus die zwei Werte, du hast 'TimeSpan', benutze' TimeSpan' – Ian

Antwort

1

Ihre _streamStartTime sollte auch eine DateTime sein. Dann in Ihrem Click Ereignishandler zuweisen DateTime.Now es, nicht verwenden TimeOfDay nur:

private void StreamClick_Click(object obj) 
{ 
    _streamStartTime = DateTime.Now; 
} 

dann in Ihrer Berechnung, Sie einfach negieren müssen TimeSpan die beiden DateTime zu bekommen. Verwenden Sie die TimeSpan Ihre Zeit zu produzieren string:

private void LiveVideoStream_Tick(VideoCaptureDevice cam) 
{ 
    TimeSpan _currentRecordTime = DateTime.Now - _streamStartTime; 
    string RecordTime = _currentRecordTime.TotalDays.ToString() + " " + _currentRecordTime.Hours.ToString() + ":" + 
     _currentRecordTime.Minutes.ToString() + ":" + _currentRecordTime.Seconds.ToString(); 

} 
+0

In dem Klick kann ich 'DateTime.Now' nicht zuweisen, da das kein' TimeSpan' ist? –

+0

Der wichtige Punkt ist, dass '_streamStartTime' eine' DateTime' sein sollte. Wenn Sie dann minus zwei 'DateTime' eingeben, erhalten Sie eine' TimeSpan'. 'TimeSpan' ist eine großartige' Struktur', die sich mit dem Zeitunterschied befasst. Es hat viele nützliche Eigenschaften/Felder wie Tage, Stunden, Minuten, Sekunden, Millisekunden, sowie TotalDays, TotalHours, TotalMinutes, TotalSeconds, etc ... probiere das aus! – Ian

+0

Ja das scheint jetzt zu funktionieren. 'TimeSpan' gibt viele Eigenschaften. Ein Problem, anstatt ".TotalDays" zu verwenden, kann ich '.Days' verwenden, da''TotalDays' 'mir eine große Zahl zurückgibt und ich nur Zahlen wie '0,1,2 anzeigen möchte, 3,4,5'. –

1

Verwenden Sie keine DateTime.Now weil der Systemtakt rückwärts oder vorwärts in seltenen Fällen springen. DateTime.UtcNow ist viel sicherer - keine Sommerzeit - aber immer noch nicht kugelsicher.

Sie sollten stattdessen StopWatch verwenden.

+0

Ich bin ein bisschen spät, aber ich muss damit einverstanden sein, dass dies die" sicherste "Lösung ist. –

Verwandte Themen