TimeSpan Format

  • VB.NET

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

    TimeSpan Format

    Hallo Leute,
    mich beschäftigt schon seit längerem der Datentyp TimeSpan. Aus mir unersichtlichen Gründen haben sich die .Net-Framwork Desinger dazu entschieden Zeiträume mit kompletten Tagen darzustellen.

    VB.NET-Quellcode

    1. Dim Zeitraum as new TimeSpan(36,0,0)
    2. ...
    3. 'Problem
    4. Debug.Print(Zeitraum.toString) 'Gibt 1.12:00:00 aus <-Will ich nicht
    5. 'Lösungsansatz
    6. Debug.Print(String.Format("{0}:{1}:{2}, Zeitraum.TotalHours, Zeitraum.Minutes, Zeitraum.Seconds) 'Gibt 36:00:00 aus <-da will ich hin

    Wie man im dem Code-Schnipsel sehen kann habe ich ja auch bereits eine unsaubere Lösung.

    Jetzt kommt es aber schonmal vor, dass man in einem DataGridView oder anderen Steuerelementen TimeSpans verwendet (in meinem Fall ZedGraph). Dort ist die Lösung allerdings nicht ganz so einfach, da man nicht ohne großes Drumherum seine TimeSpans entsprechend manipulieren kann. Die immer verfügbare Schnittstelle ist der FormatProvider. Dort gibt es jedoch keine Möglichkeit TotalHours auszugeben (volle Tage werden von den Stunden abgezogen was ja auch logisch ist, da sie ja in Days ausgegeben werden).
    Ich suche jetzt nach einer Lösung den FormatProvider zu erweitern, so dass man TotalHours ausgeben kann. Hat da schonmal jemand was versucht und Erfahrungen mit gemacht?
    Käme ggf. eine Extension infrage? Anwendung wäre bei Dir dann Zeitraum.ToSpecialString()

    VB.NET-Quellcode

    1. Public Module TimeSpanExtension
    2. <Runtime.CompilerServices.Extension>
    3. Public Function ToSpecialString(StdTimeSpan As TimeSpan) As String
    4. Dim TotalHours = StdTimeSpan.Days * 24 + StdTimeSpan.Hours
    5. Return (TotalHours.ToString("d2") & ":" & StdTimeSpan.Minutes.ToString("d2") & ":" & StdTimeSpan.Seconds.ToString("d2"))
    6. End Function
    7. End Module
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Diesen Ansatz wollte ich eigentlich mit meinem eigangs erwähnten Ansatz verdeutlichen. Mir geht es darum

    VB.NET-Quellcode

    1. DataGridView1.DefaultCellStyle.Format = "HH:mm:ss"
    einfach umzusetzen. Wobei HH dann entsprechend die vollen Tage rausrechnet. Zugegeben bei einem DataGridView könnten man das noch entsprechend lösen. Ich suche jedoch eine Möglichkeit die über den Standart FormatProvider arbeitet und wollte den dazu entsprechend erweiteren. Mein Ziel ist es im Prinzip dieses Problem des Format "TimeSpan" an der Wurzel zu packen und nicht für jedes Steuerelement ein Workaround zu bastlen.

    jdoerr schrieb:

    VB.NET-Quellcode

    1. 'Gibt 36:00:00 aus <-da will ich hin
    Das wäre ja ein Fehler.

    .TotalHours ist ein Double, der die komplette Dauer in der Einheit Stunden ausgibt.
    Den 60-fachen Wert bekommst Du, wehh Du .TotalMinutes ausgibst usw.

    VB.NET-Quellcode

    1. Dim Zeitraum As New TimeSpan(29, 36, 10, 10)
    2. ListBox1.Items.Add(Zeitraum.TotalHours * 60)
    3. ListBox1.Items.Add(Zeitraum.TotalMinutes)

    Entweder Du gibst eine Total-Eingeit oder alle einzelnen Nicht-Total-Einheiten aus.
    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!
    Ich möchte halt bei einem TimeSpan 72:00:00 haben statt 3.00:00:00 . Das kann ich ja wie schon angedeutet über String.Format erreichen. Allerdings habe ich nicht bei allen Steuerelementen die Möglichkeit die Zeiten nachträglich über String.Format zu konvertieren. Oftmals hat man bei Community-Steurelementen wie z.B ZedGraph, aber auch vielen anderen, nur die Möglichkeit auf die .Format Eigenschaft zurückzugreifen. Wenn ich jetzt aber XY.Format = "HH:mm:ss" hinschreibe würde aber als Ausgabe beim Eingangs erwähnten TimeSpan 00:00:00 rauskommen. Dafür habe ich noch keine praktikable Lösung gefunden, denn in der Regel muss man in den Code des Steuerelementes rein und dort mit String.Format entsprechende Änderungen einpflegen.

    Mein Wunsch oder meine Idee besteht darin, die Möglichkeiten von XY.Format Methode darauf hin zu erweitern, dass man auch die TotalHour Werte anzeigen lassen kann.

    jdoerr schrieb:

    dass man auch die TotalHour Werte anzeigen lassen kann
    Das würde dann sehr einfach gehen, wenn die Einzel-Werte für Minuten, Sekunden und Millisekunden Null sind.
    Wenn Du Dir ggf. zwei TimeSpan-Instanzen machst, die eine für die großen Werte bis inc. Stunde => TotalHours und die andere für die "Pimperlinge":

    VB.NET-Quellcode

    1. Dim DeinWert = String.Format("{0}:{1:00}:{2:00}", large.TotalHours, small.Minutes, small.Seconds)

    Ganz einfach:

    VB.NET-Quellcode

    1. Dim DeinWert = String.Format("{0}:{1:00}:{2:00}", CInt(small.TotalHours), small.Minutes, small.Seconds)
    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!

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