Laden...

Uhrzeit ähnlich Timeonly

Erstellt von kstanger vor einem Jahr Letzter Beitrag vor einem Jahr 820 Views
K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr
Uhrzeit ähnlich Timeonly

Hallo allerseits,

ich möchte eine Uhrzeit im Format HH:mm darstellen und dabei mit Minuten rechnen. Es geht mir dabei nicht um eine Uhrzeit, die mit einem Datum verknüpft ist und mit der intern mit Ticks gerechnet wird. Ich möchte ausschließlich Minuten. Gibt es so etwas oder muss ich mir das selbst basteln?
Als Alternative könnte ich mir noch vorstellen, dass ich mit Sekunden rechne, aber nur HH:mm darstelle. Ich arbeite mit .Net4.8, so dass Timeonly nicht in Frage kommt.

Karl Stanger
D
152 Beiträge seit 2013
vor einem Jahr

Dann kannst Du doch TimeSpan nehmen.
Oder einfach ein int/long (ganze Minuten), wenn eine Genauigkeit von Minuten reichen,

K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr

Hallo,
mit TimeSpan funktioniert die eine Richtung sehr gut, aber die andere Richtung ist problematisch. Ich habe es daher selbst programmiert und im folgenden Beispiel demonstriert:


using System;
using System.Text.RegularExpressions;

namespace Demo_Uhrzeit_MinutenProTag
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string pattern = @"^(2[0-3]|[01]?[0-9]):([0-5]?[0-9])$";
            string uhrzeit;
            int totalmin;
            int stunden;
            int minuten;

            // Anzahl der Minuten pro Tag in Uhrzeit (hh:mm) umwandeln
            Console.Write("Total Minuten: ");
            totalmin = int.Parse(Console.ReadLine());
            if (totalmin < 0 || totalmin > 1439)
            {
                Console.WriteLine("Fehler: Anzahl Minuten nicht im Bereich eines Tages (0 - 1439)");
            }
            else
            {
                stunden = totalmin / 60;
                minuten = totalmin % 60;
                uhrzeit = stunden.ToString("D2") + ":" + minuten.ToString("D2");
                Console.WriteLine("Uhrzeit = " + uhrzeit);
            }
            Console.WriteLine();

            // Uhrzeit in Anzahl der Minuten pro Tag umwandeln
            Console.Write("neue Uhrzeit: ");
            uhrzeit = Console.ReadLine();
            MatchCollection match = Regex.Matches(uhrzeit, pattern);
            if (match.Count > 0)
            {
                int position = uhrzeit.IndexOf(":");
                stunden = int.Parse(uhrzeit.Substring(0, position));
                minuten = int.Parse(uhrzeit.Substring(position + 1));
                totalmin = stunden * 60 + minuten;
                Console.WriteLine("Total Minuten: " + totalmin.ToString());
            }
            else
            {
                Console.WriteLine("Fehler: Format falsch oder Uhrzeit größer 23:59");
            }
            Console.ReadLine();
        }
    }
}


Karl Stanger
T
2.223 Beiträge seit 2008
vor einem Jahr

Anhand deines Beispiel liefert dir TimeSpan eigentlich alls nötige.
Du kannst einen String einfach über TimeSpan.TryParse(Exact) verarbeiten lassen.
Erzeugen kannst du dann auch dein TimeSpan über TimeSpan.FromMinutes.

Damit sparst du dir das basteln mit Regex.
Für die Ausgabe kannst du dann auch ToString mit dem Format für Stunden:Minuten vorgeben.

Doku:
TimeSpan.FromMinutes(Double) Method (System)
TimeSpan.TryParse Method (System)
TimeSpan.ToString Method (System)

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.830 Beiträge seit 2008
vor einem Jahr

Ich weiß, Du scheinst irgendeine enorme Allergie gegen die Dokumentation zu haben - aber auch bei diesem Thema ist alles dokumentiert.
Standard date and time format strings

K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr

Ich weiß, dass alles dokumentiert ist. Ich lese auch die Dokumentation, aber ich verstehe nicht alles. Bitte bedenkt, dass ihr etliche Jahre Wissensvorsprung gegenüber mir habt. Wenn ich z.B. nur einmal die TimeSpan-Doku lese, dann bedeutet das nicht, dass ich auch alles verstehe. Und alle 5 Worte ist ein Verweis auf irgend etwas, von dem ich nicht weiß, ob es sehr wichtig, wichtig oder eben nur nice to know ist. Von DataGridView, BindingSource, usw. weiß ich seit ein paar Wochen, dass es das gibt. Bitte verzeiht mir, dass ich das nicht alles verstehe.

Andererseits habe ich mich früher mal mit Regulären Ausdrücken beschäftigt: heute ist es für mich "einfach", einen Regex-String zu verstehen. Genau so mit Datumsformaten: in der Vergangenheit habe ich damit gekämpft, dass User sehr gerne ihre "eigenen" Datumsformate benutzt haben. Das hat dazu geführt, dass ich die (Culture-Spezifischen) alle kennenlernte und letzendlich den Usern einen Kalender zu anklicken gegeben habe, so dass sie gezwungen waren, diesen und nur diesen zu benutzen. Das Datum mit Uhrzeit habe ich dann als Unix-Timestamp intern benutzt.

Trotzdem bin ich bereit, eure Expertise anzunehmen und auch zu nutzen - ich bin euch sehr dankbar, dass ihr mir überhaupt helft. Und entschuldigt bitte, dass ich hier so rumjammere - aber das musste jetzt mal raus.

Wenn ihr alle Zeit der Welt habt und auch die Lust dazu, dann kann mir ja mal jemand ein Code-Snippet erzeugen, mit dem man das, was ich da verbrochen habe, besser und C#-modern darstellt.

Karl Stanger
16.830 Beiträge seit 2008
vor einem Jahr

Bitte bedenkt, dass ihr etliche Jahre Wissensvorsprung gegenüber mir habt.

Tatsächlich gehts den meisten Deinen Themen eigentlich gar nicht um Erfahrung oder Wissensvorsprung, sondern maßgeblich tatsächlich von Grundverständnis und von Verwendung.
Erfahrung würde dann zum Tragen kommen, wenn es um "Best Practises" oder Vorgehensmodelle gehen würde.
Der Verweis auf eine Dokumentation ist zudem nicht negativ, sondern einfach nur: hier kannst nachlesen.

Du hast aktuell das klassische Einsteiger-Try And Error Vorgehen. Kann man machen; hat aber nur Erfolg bis zu einem gewissen Level.
Und als Du in verknüpfte Daten in dataGridView kennzeichnen geschrieben hast

Wie soll man darauf kommen?

Ja, das ist genau sowas, worauf man drauf kommt, wenn man das Konzept dazu durchgelesen (und verstanden) hat 🙂
Das kommt einem eben nicht zugeflogen, auch uns nicht. Mussten wir alle durch 🙂

Wir haben oft, einige sogar beruflich, mit Einsteigern zutun; haben hier also wirklich Erfahrung, wie Leute Zeug wohl am besten lernen. Aber wir haben auch Erfahrung wie es aussieht, wenn jemand nur vor sich her programmiert ohne versucht das Konzept nachzuvollziehen 🙂
Und Du hast durchaus hier ein paar Themen bisher gehabt, da weiß man einfach: Okay, Du hast es Dir nich 1 mal durchgelesen, wie das eigentlich funktioniert. Wurde Dir ja auch von veschiedenen Personen gesagt 🙂

Wenn Dir wie hier jemand sagt "machs mit TimeSpan" und Du sagst "nicht hinbekommen, ich habs selbst gemacht" - ja gut, wird Dich keiner aufhalten.

Das doofe ist: im Endeffekt antworten wir Dir oft das, was Du oft in der Doku nachlesen kannst. Und das ist halt schade.

190 Beiträge seit 2012
vor einem Jahr

Ich bin immer wieder erstaunt, wenn Einsteiger/Umsteiger mit TimeSpan, DateTimeOffset usw. hadern und lieber ihre eigenen Lösungen suchen. Mit diesen Klassen kann man fast alles machen, was man in diesem Zusammenhang benötigt. Parsen von Strings, Umwandlung in Strings, rechnen und das abhängig von der Ländereinstellung. Das können die eigenen Lösungen meistens nicht. Man muss auch beachten, das TimeSpan in vielen anderen Klassen verwendet wird, dann hat man mit der eigenen Lösung ein Problem.

  • Wer lesen kann, ist klar im Vorteil
  • Meistens sitzt der Fehler vorm Monitor
  • "Geht nicht" ist keine Fehlermeldung!
  • "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF

K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr

Wenn ihr sagt, dass es mit TimeSpan oder DateTime funktioniert, dann zeigt mir bitte doch die Lösung!
Was ich brauche, ist ganz einfach:

  • Minuten als int im Gültigkeitsbereich von 0 bis 1439 sollen umgewandelt werden in einen String im Format "hh:mm".
  • Und umgekehrt.
Karl Stanger
190 Beiträge seit 2012
vor einem Jahr

            int  input = 1439;
            string result = TimeSpan.FromMinutes(input).ToString(@"hh\:mm");
            double result2 = TimeSpan.Parse(result).TotalMinutes;
            Console.WriteLine($"Input: {input}  Zwischenergebnis: {result}  Endergebnis: {result2}");


Macht 2 Zeilen Code. Funktioniert so aber nur bis 1439. Erklärung in der Doku.

  • Wer lesen kann, ist klar im Vorteil
  • Meistens sitzt der Fehler vorm Monitor
  • "Geht nicht" ist keine Fehlermeldung!
  • "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF

K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr

Hallo Wilfried,

vielen Dank für deine Lösung. Ich habe es noch nicht ausprobiert.
Ich habe sofort nachgeschaut, warum ich das nicht herausgefunden habe, obwohl ich die Tipps hatte, insbesondere die von T-Virus.

  • Bei deiner Zeile 2 wusste ich nicht, dass man das gewünschte Format bei ToString angeben kann. Ich dachte, das wäre immer ToString(). Lerneffekt: Jetzt verstehe ich, dass ToString() das Default-Ergebnis liefert und dass man bei Angabe des gewünschten Formats eben dieses als Ergebnis hat.
  • Bei deiner 3. Zeile wusste ich nicht, dass ich die TotalMinutes-Eigenschaft anhängen muss. Hier habe ich eben nicht alles gelesen, was es zu TimeSpan gibt. Lerneffekt: ich muss nicht nur entweder die Methoden oder Eigenschaften ansehen, sondern alles und im Zusammenhang verstehen.

Ich hoffe, dass ich das jetzt so richtig verstanden habe. Weiterhin hoffe ich, dass ich zukünftig ein besseres Verständnis zur Doku entwickle.
Vielen Dank für eure Hilfe und auch eure Kritik an meiner Vorgehensweise.

Karl Stanger
16.830 Beiträge seit 2008
vor einem Jahr

ToString() ist eine Standard-Methode jedes Objekts.
Standardmäßig wird einfach der Typ als String ausgegeben.
Object.ToString Method (System)

Jede abgeleitete Klasse kann eine solche Methode jedoch überschreiben und ein eigenes Verhalten implementieren, wie es bei allen Zeit-Typen der Fall ist.

190 Beiträge seit 2012
vor einem Jahr

Es gibt zwei wichtige Dinge, die man hier benötigt. Man muss die Doku lesen und verstehen und man muss debuggen können. Denn bei solchen Fragen bekommt man meistens nur den Link für die Doku. Und dort findet man alle Methoden und die Erklärung dazu.
Und: "Wissen heißt wissen, wo es geschrieben steht", hat Albert Einstein gesagt.

  • Wer lesen kann, ist klar im Vorteil
  • Meistens sitzt der Fehler vorm Monitor
  • "Geht nicht" ist keine Fehlermeldung!
  • "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF