TimeSpan addieren

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Memo.

    TimeSpan addieren

    Hallo Leute, da die SuFu zwar vielversprechendes ergibt,
    aber keine Lösung gibt, eröffne ich die Schlacht ;)

    Also:
    Ich möchte in einem Label 00:00 dann 00:01 usw.
    anzeigen. Jede Sekunde. Ich hab mich also an DateTime und TimeSpan erinnert und folgenden Code gebastelt:

    VB.NET-Quellcode

    1. Dim dt As DateTime
    2. Dim ts As New TimeSpan(0, 0, 1)
    3. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    4. Timer1.Start()
    5. End Sub
    6. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    7. dt.Add(ts)
    8. Label1.Text = dt.ToShortTimeString
    9. End Sub


    Funktioniert nicht ganz, wie man sich vorstellen kann.
    Was ist jetzt falsch?
    Machs mit einem StopWatch Objekt:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. Timer1.Start()
    3. sw.Start()
    4. End Sub
    5. Dim sw As New System.Diagnostics.Stopwatch
    6. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    7. Me.Text = sw.Elapsed.ToString
    8. End Sub



    Gruss
    Pascal

    Memo schrieb:

    Funktioniert nicht ganz, wie man sich vorstellen kann

    Kann man sich vorstellen, schliesslich initialisierst Du ja dt überhaupt garnicht und was soll er Deiner Meinung nach dann im Label ausgeben.

    Ausserdem ist das Tick-Event des Timers extrem ungenau, da er genauso wie der Rest Deines Codes auf dem GUI-Thread ausgeführt wird, d.h. das Event kann nur ausgeführt werden wenn Dein Code gerade mal Pause macht.

    Besser ist es die verstrichene Zeit seit Timer-Start zu messen, entweder druch Subtraction von Now()-StartTime oder wie von Pascal vorgeschlagen gleich die Stopwatch Klasse zu benutzen.

    Ausgeben kannst Du es dann mit String.Format:

    VB.NET-Quellcode

    1. Label1.Text = String.Format("{0:00}:{1:00}", elapsedTime.Minutes, elapsedTime.Seconds)
    Ist ja nur ein Beispiel gewesen. Timer verwende ich meistens nur wenns eh nicht wichtig ist... (<- Meistens Nicht wichtig :D)

    Das mit addieren jede Sekunde war nur ein Beispiel...
    Was ist wenn ich auf Button-Klick 1 Sekunde dazuaddieren möchte?

    PS: Dim dt As New DateTime(0) funktioniert auch nicht :(
    Ja kann ich: Ich möchte nämlich irgendwas mit + ;)

    Nö ich meine das ca so:

    VB.NET-Quellcode

    1. Dim dt As New DateTime(0)
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. dt.AddSeconds(1)
    4. Label1.Text = dt.ToLongTimeString
    5. End Sub


    Das Problem ist, dass im Label immer 00:00:00 steht.

    Memo schrieb:

    Ja kann ich: Ich möchte nämlich irgendwas mit +

    Das war schonmal ganz gut ...

    Nur weiss ich immer noch nicht was Du mit dem New DateTime(0) bezweckst, das entspricht in VB dem 01.01.0001 um 00:00:00 Uhr. Wenn Du nicht irgendwas zu Jesus (angeblicher) Geburtsstunde hinzurechen möchtest, ist das für mich ziemlich sinnfrei.

    Memo schrieb:

    Das Problem ist, dass im Label immer 00:00:00 steht.

    Das wird es auch wenn Du dort Stunden oder Jahre draufaddierst: Date.AddSeconds ist eine Function, d.h. es gibt einen neuen Wert zurück ohne das Original-Date zu verändern.
    Aha. Jetzt hab ichs kapiert. ^^

    Ich wollte es so:

    VB.NET-Quellcode

    1. Dim dt As New DateTime(0)
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. dt = dt.AddSeconds(1)
    4. Label1.Text = dt.ToLongTimeString
    5. End Sub