Zeitspanne berechnen und Ausgabe formatieren

CopWorker

Erfahrenes Mitglied
Hallo,
ich bin dabei ein Zeitspanne an einem Terminal auszugeben.
Das Berechnen der Zeitspanne und die Ausgabe formatieren ist nicht das Problem.
Bitte nicht auf die Endlosschleife achten, die ist nur testweise so. Der Inhalt läuft in einer gesteuerten Schleif in meinem Projekt.
C#:
string strTime = "";
double dStartReadyTime = new double(), dTimeSpan = new double();


do
{
    if (dStartReadyTime.Equals(0.0))
        dStartReadyTime = DateTime.Now.ToOADate();

    dTimeSpan = DateTime.Now.ToOADate() - dStartReadyTime;
    strTime = string.Format("Einheit bereit seit {0}", DateTime.FromOADate(dTimeSpan).ToString("yyyy-MM-dd HH:mm:ss.fff"));

} while (true);

Leider zeigt es im String "strTime" die Zeitspanne beginnend im Jahre 1899-12-30 an.
"Einheit bereit seit 1899-12-30 00:00:00.481"
"Einheit bereit seit 1899-12-30 00:01:28.916"
usw.

Gibt es eine Möglichkeit, dass die Ausgabe im String bei Jahr 0, Monat 0, Tag 0 startet.
Denn bei dTimeSpan = 0 ist das Ergebnis im String:
"Einheit bereit seit 1899-12-30 00:00:00.000"

Auch die Korrektur der Jahre, Monate, Tage führt zu einem Absturz des Programms.
C#:
string strTime = "";
double dStartReadyTime = new double(), dTimeSpan = new double();


do
{
    if (dStartReadyTime.Equals(0.0))
        dStartReadyTime = DateTime.Now.AddYears(-1899).AddMonths(-12).AddDays(-30).ToOADate();

    dTimeSpan = DateTime.Now.AddYears(-1899).AddMonths(-12).AddDays(-30).ToOADate() - dStartReadyTime;
    strTime = string.Format("Einheit bereit seit {0}", DateTime.FromOADate(dTimeSpan).ToString("yyyy-MM-dd HH:mm:ss.fff"));

} while (true);

Vielen Dank im Voraus.
Gruß CopWorker
 
Sieht nach falschem Format bzw. Funktion aus (ToOADate bzw. FromOADate)
DateTime.ToOADate Method (System)
The ToOADate method throws an OverflowException if the current instance represents a date that is later than MaxValue and earlier than midnight on January1, 0100.
--> Niedrigstes Datum ist der 1. Januar 0100
Und Wert "0" ist immer der 30. Dezember 1899 Mitternacht

Ich glaube dein Problem ist, dass du für die Zeitspanne einen "signed double" verwendest, welcher auch negative Werte hat.

Und eine Zeitspanne (zumindest nach deinem Beispiel) ist immer positiv.
Gibt es einen "unsigned double"?

Ausserdem versuchst du den Wert der Zeitspanne in ein Datum umzuwandeln.
Das sieht für mich falsch aus.
Du musst den Wert der Zeitspanne "aufdröseln" in Jahre, Monate, Tage, Stunden, Minuten, Sekunden
Sieht mir eher nach nem Thema wie DateDiff aus.
Denk mal nach:
StartDatum heute (=45785.0), EndDatum morgen (=45786.0)
Differenz ist: 1
Wenn du aber aus dem Wert "1" ein Datum machst, landest du beim 31.12.1899

Da du ja anscheinend bis in die Millisekunden gehst (?), nutze DateDiff mit Millisekunden als Intervall (Denk aber an Overflow --> Millisekunden laufen mal schnell an die Grenze von 64-Bit)
Ich glaube mich dunkel daran zu erinnern, dass ich mal so was ähnliches hier im Datenbank-Forum hatte
 
Zuletzt bearbeitet:
Hallo Zvoni,
ich hab in meiner 25 jahrigen C - Code Entwicklung noch nie eine unsigned double verwendet.
Das muss ich mir mal anschauen.
Ich hab inzwischen die Klasse/Objekt TimeSpan entdeckt.
Vielleicht komm ich da weiter.
Aber trotzdem vielen Dank.
Gruß CopWorker
 
Hallo Zvoni,
ich hab in meiner 25 jahrigen C - Code Entwicklung noch nie eine unsigned double verwendet.
Das muss ich mir mal anschauen.
Ich hab inzwischen die Klasse/Objekt TimeSpan entdeckt.
Vielleicht komm ich da weiter.
Aber trotzdem vielen Dank.
Gruß CopWorker
No prob.
In meiner Recherche habe ich überall den Hinweis gefunden, dass wenn du einen TimeSpan in deinem Format darstellen möchtest "0 Jahre, 0 Monate, 3 Tage, 6 Stunden....usw" du das von Hand aufdröseln musst
(was ja nicht wirklich schwierig ist mit Integer-Division bzw. Modulo-Mathe).

Und was die TimeSpan-Klasse btrifft: TimeSpan Struct (System)
Die hat kein "Years" oder "Months", nur "Days" als "höchstes" Kriterium.
Vielleicht als Sprungbrett benutzen, und nur den Wert von "Days" runterdröseln in Monate und Jahre,
wobei es dann spannend wird bei Schaltjahren

EDIT: Die DateTime-Klasse DateTime Struct (System)
Hat "Year" und "Month"
Einfach die einzelnen "Komponenten" der zwei DateTime-Objekte (Keine Doubles!!) jeweils von einander subtrahieren?
(Aircode. Bin kein NET-ter)
C#:
DateTime DT1;   //Früheres Datum
DateTime DT2;  //Späteres Datum
Integer Jahr, Monat, Tag, Stunde, Minute, Sekunde;
Jahr = DT2.Year-DT1.Year;  //AUFPASSEN --> hier kann ein falsches Ergebnis herauskommen. Denk an Jahreswechsel
Monat = DT2.Month-DT1.Month; //AUFPASSEN --> Hier kann es negative Werte geben!
Tag = DT2.Day-DT1.Day;  //AUFPASSEN --> Hier kann es negative Werte geben!
usw...
Und genau aus obigen Problemen (siehe Kommentar), gibts im TimeSpan wohl nur "Days"

EDIT2: Yep.
Jetzt weiss ich es wieder, dass ich sogar mal nen Quellcode in Pascal gefunden habe, wo eine Zeitspanne zwischen zwei Tagen in Jahr, Monat und Tag aufgedröselt wurde.
Sieht nicht mal kompliziert aus.
Sind mal 16 Zeilen Code.
Falls du das von hand implementieren willst gib Bescheid
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück