Zwei TimeSpan addieren

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von Radinator.

    Zwei TimeSpan addieren

    Hallo,

    Ich würde gerne zwei TimeSpan zusammen zählen.


    In etwa so:

    VB.NET-Quellcode

    1. Dim Time As New TimeSpan(HHMMSS(0).ToString, HHMMSS(1).ToString, HHMMSS(2).ToString)
    2. Dim EndTime As TimeSpan
    3. EndTime.Add(Time)


    Ich weiß nicht ob es so gehen "sollte" aber bei mir kommt dort immer nur "00:00:00" bei raus.

    Könnt Ihr mir da helfen?
    Wieso machst denn bitte ein .ToString() ? und was ist genau dein HHMMSS ?

    Aktiviere bitte erst mal unter Projekt > <Projektname>-Eigenschaften > Kompillieren > Option Stric auf On. Dann solltest du sehen, dass der Konstruktor (vereinfacht gesagt, denn Timespan ist keine Klasse sondern eine Struktur) als Parameter keinen String sondern Integer nimmt.

    Hier mal ein kleines Beispiel:

    VB.NET-Quellcode

    1. Module Module1
    2. Sub Main()
    3. Dim t1 As TimeSpan = New TimeSpan(1, 1, 1, 1)
    4. Dim t2 As TimeSpan = New TimeSpan(1, 1, 1, 1)
    5. Dim t3 As TimeSpan = t1 + t2
    6. Console.WriteLine(t3)
    7. End Sub
    8. End Module


    Außerdem ist Timespan.Add eine Funktion! Das hat zur Folge, dass sie einen Wert zurück gibt. Wenn du einfach nur TimeSpan.Add() machst, dann addiert er zwar den Wert, das Ergebnis ist dann aber auch schon in der nächsten Zeile weg, da du es nirgends speicherst. Musst noch eine Zuweisung machen, dann sollte es gehen
    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Okay erstmal danke für die Antworten @Radinator & @ErfinderDesRades,

    Option Strict ist jetzt auf On. (Was genau bewirkt Option Strict On/Off?)


    VB.NET-Quellcode

    1. Dim EndTime As TimeSpan
    2. For Each line In tbDurationList.Lines
    3. Dim CurrentLine As String = line
    4. Dim HHMMSS As Array = CurrentLine.Split(CType(":", Char()))
    5. Dim Time As New TimeSpan(Convert.ToInt16(HHMMSS(0)), Convert.ToInt16(HHMMSS(1)), Convert.ToInt16(HHMMSS(2)))
    6. Dim timeSum As TimeSpan = EndTime + Time
    7. Next

    Durch Option Strict On sagt er mir in Zeile 6 bei "HHMMSS" immer "Option Strict On lässt spätes Binden nicht zu.". Womit ich leider nicht viel anfangen kann...

    Ich hoffe Ihr könnt den "Quatsch" da oben nachvollziehen & mir ein wenig Erleuchtung schenken... :/

    ErfinderDesRades schrieb:

    in zeile#6 kann nicht sein, die ist leer


    Danke für´s drauf hinweisen…

    Damit auch keine Missverständnisse aufkommen: Ich meinte Zeile 5.

    @ErfinderDesRades
    Was meinst du mit Datentypen konkret benennen?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mr.VB-Schüler“ ()

    nö - kriegt man doch nicht angezeigt.
    Das problem ist, dass die Array-Klasse so nicht indizierbar ist.
    Array hat keine Default-Property, wo du einfach ein (0) anhängen kannst, und ergibt ein Element.

    Array ist ein Datentyp, den man eiglich nie benutzt/benutzen sollte.

    Welchen Datentyp ergibt CurrentLine.Split(CType(":", Char()))?
    Es ist nicht einfach ein Array - sondern was?

    gugge auch Video-Tut: Welchen Datentyp hat das Objekt?

    den Array kannst du nicht nutzen - nimm einen anderen Datentyp.
    Nimm den Datentyp, den CurrentLine.Split(CType(":", Char())) ergibt, aber dazu musst du dir die Mühe machen, meine Frage zu beantworten zu versuchen.

    Ich würde dich nur ungern mit evtl. funktionierendem Code abspeisen, und am Ende kannst du immer noch nicht ein Array von einem String() unterscheiden.
    Mach hinter MessageBox.Show(CurrentLine.Split(CType(":", Char())) einen Punkt und siehe, was dir Intellisence anbietet.
    In diesem Fall wählst du .GetType und hängst ein .ToString an.
    Das ganze lässt du dir in z.B. einer MessageBox ausgeben.
    MessageBox.Show(CurrentLine.Split(CType(":", Char())).GetType.ToString)

    Mr.VB-Schüler schrieb:

    VB.NET-Quellcode

    1. Dim Time As New TimeSpan(HHMMSS(0).ToString, HHMMSS(1).ToString, HHMMSS(2).ToString)
    2. Dim EndTime As TimeSpan
    3. EndTime.Add(Time)
    Du hast den Rückgabewert des Add()-Operators ignoriert:

    VB.NET-Quellcode

    1. EndTime = EndTime.Add(Time)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Guten Morgen,

    vorweg nochmal danke für eure Hilfe und vor allem für eure Geduld.

    Nachdem ich das Video TuT gesehen hab ist mir klar, dass es sich im einen String Array handelt.

    Quellcode

    1. CurrentLine.Split(CType(":", Char()))





    Außerdem hab ich es mit den Informationen von euch ganz gut zu Ende bekommen...(Es funktioniert zumindest)
    Und jetzt wollte ich noch wissen ob dort noch von der schönheit her etwas optimiert werden kann.

    VB.NET-Quellcode

    1. Dim EndTime As TimeSpan
    2. Try
    3. For Each line In DurationList.Lines
    4. Dim CurrentLine As String = line
    5. Dim HHMMSS As String() = CurrentLine.Split(CType(":", Char()))
    6. Dim Time As New TimeSpan(CInt(HHMMSS(0)), CInt(HHMMSS(1)), CInt(HHMMSS(2)))
    7. EndTime = EndTime.Add(Time)
    8. Next
    9. MsgBox(EndTime.ToString)
    10. Catch ex As Exception
    11. MsgBox(ex.Message)
    12. End Try
    @Mr.VB-Schüler Machst Du

    VB.NET-Quellcode

    1. For Each line In DurationList.Lines
    2. Dim HHMMSS As String() = line.Split(":"c)
    3. Dim Time As New TimeSpan(CInt(HHMMSS(0)), CInt(HHMMSS(1)), CInt(HHMMSS(2)))
    4. EndTime = EndTime.Add(Time)
    5. Next
    6. MessageBox.Show(EndTime.ToString)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    oh - vb-learner learnt! Dassis gut - viele tun nur so.

    Also guck dir das hier mal an:

    VB.NET-Quellcode

    1. Private Sub Test()
    2. MessageBox.Show(ReadTimeSum(TextBox1.Lines).ToString)
    3. End Sub
    4. Private Function ReadTimeSum(lines As String()) As TimeSpan
    5. Dim EndTime As TimeSpan = TimeSpan.FromDays(0)
    6. For Each line In lines
    7. EndTime += TimeSpan.ParseExact(line, "hh\:mm\:ss", CultureInfo.CurrentCulture)
    8. Next
    9. Return EndTime
    10. End Function
    Ich habe den Deppen-Namespace rausgeworfen (Microsoft.Visualbasic, s.a. Link#2), und bemühe die Timespan.ParseExact-Methode (s.a. link#3, #4).
    Und den TryCatch auch entfernt - meine Methode setzt valide Daten voraus (s.a. link#1).

    Hier dazu Weiterführendes:
    1. TryCatch ist ein heißes Eisen
    2. Visual Studio - Empfohlene Einstellungen
    3. String.Format

    Und die Timespan.ParseExact-Methode findet man im ObjectBrowser:
    4. VisualStudio richtig nutzen (Google ist nicht deine Mami)

    (dassis aber noch nicht Ende Fahnenstangem, sondern es kann noch weiter gehen - stichwort Linq)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Um deine Frage zu klären

    Mr.VB-Schüler schrieb:

    Was genau bewirkt Option Strict On/Off?


    Das Option Strict (ich nenne es mal "Feature") ist eine Einstellung für den Compiler. Wenn das auf "Off" gestellt ist, dann nimmt der Compiler die Typenprüfung nicht so genau. So kannst du dann etwa einem String einen Integerwert zuweisen oder einer Integervariable einen String ("Das ist ein Text") Zuweisen. Während des Codens stört sich daran keiner. Nur zur Laufzeit wirst du dann eine Exception bekommen "Ungültige Konvertierung von der Zeichenfolge Das ist ein Text in Typ Integer. ---> System.FormatException: Die Eingabezeichenfolge hat das falsche Format. (Kommt beim folgenden Bsp mit Option Strict Off zur Laufzeit:

    Folgendes geht bei Option Stric On nicht:

    VB.NET-Quellcode

    1. Module Module1
    2. Sub Main()
    3. Dim integervariable As Integer = 0
    4. Dim stringvariable As String = ""
    5. integervariable = "Das ist ein Text" 'Hier meckert der Compiler, dass das nicht geht (Keine Implizite Konvertierung)
    6. stringvariable = 526
    7. End Sub
    8. End Module


    Wenn du aber das Feature ausschaltes (Option Stric Off), dann ist das ganz problemlos (zur Programmierzeit !!) möglich. Wenn du das Programm aber laufen lässt ,wirst du eine Fehlermeldung erhalten
    Das ganze kann dann unter Umständen ganz ekelhafte Effekte haben (meistens wirst du dann vor dem Code sitzen und dich wundern, warum du ständig an ganz ungewöhnlichen Stellen eine Ausnahme erhälst). Deswegen unter Extras > Optionen > Projekte und Projektmappen > Option Strict auf "On" stellen

    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Radinator“ ()